Spring Boot 3.1.0升级后SOAP客户端JAXB异常求助
问题分析与解决方案
问题根源:Spring Boot 3.x 基于 Jakarta EE 9+,所有原 Java EE 体系的 API(包括 JAXB)均从 javax.* 包路径迁移至 jakarta.*。你的配置中混用了旧的 javax.xml.bind 依赖,且 JAXB 生成插件版本过低,生成的类仍使用 javax.xml.bind 注解,与 Spring Boot 3.x 适配的 Jakarta JAXB 运行时不兼容,导致上下文无法识别生成的请求类。
以下是具体修复步骤:
1. 清理并修正依赖
移除所有手动添加的 javax.xml.bind、com.sun.xml.bind 相关依赖,Spring Boot 3.x 的 spring-boot-starter-web-services 已内置适配 Jakarta 的 JAXB 依赖,无需手动引入。
修改后的依赖段:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2. 升级 JAXB 生成插件并配置 Jakarta 支持
将 maven-jaxb2-plugin 升级至支持 Jakarta EE 的版本(如 4.0.0),并配置插件生成使用 jakarta.xml.bind 注解的类。
修改后的插件配置:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>4.0.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaLanguage>WSDL</schemaLanguage> <generateDirectory>${project.basedir}/src/main/java</generateDirectory> <generatePackage>com.poc.consumingwebservice.wsdl</generatePackage> <schemas> <schema> <url>http://localhost:8080/ws/countries.wsdl</url> </schema> </schemas> <!-- 强制生成 Jakarta 注解类 --> <args> <arg>-Xjakarta</arg> </args> </configuration> </plugin>
3. 校验 Jaxb2Marshaller 配置
确保你的 Jaxb2Marshaller Bean 能正确识别生成的 Jakarta 注解类,示例配置:
@Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); // 指定生成类所在的包路径 marshaller.setContextPath("com.poc.consumingwebservice.wsdl"); // 或者直接显式绑定类(可选) // marshaller.setClassesToBeBound(GetCountryRequest.class, GetCountryResponse.class); return marshaller; }
4. 清理并重新构建项目
执行以下命令清理旧生成类与依赖,重新构建:
mvn clean install
完成以上修改后,生成的 JAXB 类将使用 jakarta.xml.bind 注解,与 Spring Boot 3.x 的运行时环境兼容,即可解决类上下文识别异常。
内容的提问来源于stack exchange,提问作者ram prasad
相关产品推荐
相关产品推荐

