Java14+SpringBoot下WSDL生成类包结构异常求助(maven-jaxb2-plugin)
解决Java 14 + Spring Boot下WSDL生成类未按命名空间分层包的问题
我之前也遇到过类似的版本升级后JAXB生成包结构异常的问题,结合你的情况,核心原因大概率是Java 9+模块化导致JAXB默认依赖缺失,以及jaxb插件的命名空间映射配置需要调整,下面给你分步解决方案:
一、先明确核心问题点
Java 7及以前,JAXB是JDK内置组件,插件默认能自动识别WSDL命名空间并生成对应分层包;但Java 9开始JAXB被移出了JDK默认模块,同时旧版本jaxb插件对高版本Java的兼容性不足,导致自动包分层逻辑失效。
二、具体解决方案
1. 升级并正确配置jaxb-maven-plugin
确保使用适配Java 14的插件版本,同时补充命名空间到包的显式映射。修改你的POM配置如下:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb-maven-plugin</artifactId> <version>2.5.0</version> <!-- 必须用支持Java 9+的版本 --> <executions> <execution> <id>generate-approval-ws-classes</id> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> <wsdlFiles> <wsdlFile>你的目标WSDL文件名.wsdl</wsdlFile> </wsdlFiles> <!-- 显式指定主包,同时通过绑定文件配置子包映射 --> <packageName>com.travellinck.client.approval</packageName> <bindingDirectory>src/main/resources/bindings</bindingDirectory> <bindingFiles> <bindingFile>approval-bindings.xjb</bindingFile> </bindingFiles> <generatePackage>true</generatePackage> <!-- 强制生成分层包 --> <strict>false</strict> </configuration> </execution> </executions> <!-- Java 9+必须手动引入JAXB依赖 --> <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> </plugin>
2. 创建绑定文件指定子命名空间映射
在src/main/resources/bindings目录下新建approval-bindings.xjb文件,明确每个WSDL子命名空间对应的子包:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <!-- 主命名空间对应根包 --> <jaxb:bindings schemaLocation="你的主Schema文件.xsd" node="/xsd:schema"> <jaxb:schemaBindings> <jaxb:package name="com.travellinck.client.approval"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- contact子命名空间对应contact子包 --> <jaxb:bindings schemaLocation="contact相关的Schema文件.xsd" node="/xsd:schema"> <jaxb:schemaBindings> <jaxb:package name="com.travellinck.client.approval.contact"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- 其他子命名空间按照同样格式添加 --> </jaxb:bindings>
3. 清理并重新生成类
执行以下Maven命令,确保清理旧生成文件后重新生成:
mvn clean jaxb:wsdl2java
三、额外注意事项
- 确认WSDL中的每个
<xsd:import>或<xsd:include>都正确指定了namespace和schemaLocation,否则绑定文件无法匹配到对应的命名空间。 - 如果你的项目使用Spring Boot的
spring-boot-starter-web-services,可以直接依赖它内置的JAXB组件,无需单独引入上述JAXB依赖,但插件版本仍需保持适配Java 14的2.5.0+。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

