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

OpenJDK11环境下偶发SAAJMetaFactoryImpl类找不到异常如何解决

问题根因确认

你遇到的错误核心是两个原因叠加:

  1. OpenJDK 11已经移除了内置的SAAJ实现,旧版本saaj-api 1.3.5默认查找的JDK内部类com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl已经不存在
  2. 依赖中同时存在saaj-api 1.3.5和javax.xml.soap-api 1.4.0两个API包,类加载顺序不稳定时会优先加载旧版API,导致SPI查找实现类逻辑异常

可落地解决方案

方案1:统一依赖版本(风险最低,优先推荐)

javax.xml.soap-api 1.4.0完全向下兼容saaj-api 1.3.5的接口,不需要修改核心功能代码,只需两步处理:

  1. 执行maven命令查询低版本saaj-api 1.3.5的引入来源:
mvn dependency:tree | grep -A 5 -B 5 saaj-api
  1. 对引入低版本saaj-api的依赖添加排除规则,示例如下:
<dependency>
    <groupId>引入saaj-api1.3.5的依赖groupId</groupId>
    <artifactId>引入saaj-api1.3.5的依赖artifactId</artifactId>
    <version>xxx</version>
    <exclusions>
        <exclusion>
            <groupId>javax.xml.soap</groupId>
            <artifactId>saaj-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 可选:在dependencyManagement节点锁定SAAJ相关版本,避免后续传递依赖引入冲突:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>javax.xml.soap</groupId>
            <artifactId>javax.xml.soap-api</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.messaging.saaj</groupId>
            <artifactId>saaj-impl</artifactId>
            <version>1.5.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

方案2:显式指定实现类(无需修改依赖结构,适合临时快速修复)

如果暂时无法调整依赖,可以通过指定实现类的方式跳过SPI自动查找逻辑:

  1. JVM参数配置(优先级最高,无需修改代码):
    启动时添加系统参数:
-Djavax.xml.soap.SAAJMetaFactory=com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl
  1. 代码显式实例化:
    修改SOAP消息构造逻辑,直接实例化对应版本的实现类,不走SPI查找:
// SOAP 1.1版本用这个实现
MessageFactory messageFactory = new com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl();
// SOAP 1.2版本用这个实现
// MessageFactory messageFactory = new com.sun.xml.messaging.saaj.soap.ver1_2.SOAPMessageFactory1_2Impl();
SOAPMessage message = messageFactory.createMessage(null, new ByteArrayInputStream(encryptedResponse.getBytes()));

方案3:调整依赖加载顺序

如果不能排除低版本依赖,也可以调整POM中依赖的声明顺序,将javax.xml.soap-api 1.4.0和saaj-impl 1.5.1放在saaj-api 1.3.5的前面,Maven默认按依赖声明顺序优先加载靠前的Jar包中的类,确保新版API和实现类被优先加载。


验证方式

启动应用时添加JVM参数-verbose:class,查看SAAJ相关类的加载来源,确认javax.xml.soap.*类来自javax.xml.soap-api 1.4.0,com.sun.xml.messaging.saaj.*类来自saaj-impl 1.5.1即可。

内容的提问来源于stack exchange,提问作者azrael3192

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:45:03