You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:01:01