JDK11迁移后Jakarta XML WS Provider类型转换异常求助
JDK11+MicroProfile下JAX-WS迁移适配解决方案
问题根源
- JDK11移除了自带的JAX-WS实现,必须引入第三方Jakarta兼容的JAX-WS RI
- 旧的
com.sun.xml.ws.spi.ProviderImpl基于javax.xml.ws.spi.Provider接口,而MicroProfile采用Jakarta EE的jakarta.xml.ws.spi.Provider,命名空间不匹配导致类型不兼容 - 低版本jaxws依赖(如2.x系列)属于javax命名空间,与MicroProfile容器的Jakarta类加载路径冲突,引发ClassCastException
具体解决方案
1. 引入Jakarta兼容的JAX-WS RI依赖
使用Eclipse Metro的Jakarta版本(原Sun JAX-WS RI的继任者),选择支持Jakarta EE 8+的版本(适配MicroProfile 3.x+)。以Maven为例:
<dependencies> <!-- Jakarta JAX-WS API,若MicroProfile容器已提供可设为provided --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <!-- Eclipse Metro Jakarta JAX-WS RI实现 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>3.0.2</version> <exclusions> <!-- 排除可能冲突的javax依赖 --> <exclusion> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
2. 配置Jakarta ProviderImpl
Metro的Jakarta版本会通过META-INF/services/jakarta.xml.ws.spi.Provider自动注册com.sun.xml.ws.spi.ProviderImpl(该实现适配Jakarta接口)。若自动注册失效,可手动指定:
System.setProperty("jakarta.xml.ws.spi.Provider", "com.sun.xml.ws.spi.ProviderImpl");
3. 迁移WSDL生成代码的命名空间
旧代码基于javax.xml.ws包,需批量替换为jakarta.xml.ws:
- 替换所有import语句中的
javax.xml.ws为jakarta.xml.ws - 更新
@WebService、@WebMethod等注解的包路径 - 若使用Maven生成代码,改用支持Jakarta的jaxws-maven-plugin版本:
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>3.0.2</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> <configuration> <wsdlFiles> <wsdlFile>src/main/resources/your-service.wsdl</wsdlFile> </wsdlFiles> <packageName>com.yourpackage.ws</packageName> <target>2.3</target> </configuration> </execution> </executions> </plugin>
4. 解决类加载冲突
- 彻底移除所有旧的
javax.xml.ws相关依赖(如jaxws-api、jaxws-rt的2.x版本) - 检查MicroProfile容器的类加载策略,确保Jakarta API与Metro实现由同一类加载器加载
- 若使用WildFly、OpenLiberty等容器,启用Jakarta EE 8+特性,避免容器自带的javax类干扰
5. 验证
启动MicroProfile服务,注入JAX-WS对象,确认无Provider not a subtype或ClassCastException错误。
内容的提问来源于stack exchange,提问作者pabloso18
相关产品推荐
相关产品推荐

