为了测试应用程序,我正在创建 SOAP 消息。当直接从 Eclipse (Oxygen.1a) 运行时,这是有效的,但在打包为可运行的 jar 后(选项:将所需的库打包到生成的 jar 中),我收到以下错误:
javax.xml.soap.SOAPException: Unable to create SAAJ meta-factoryProvider com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found
at javax.xml.soap.SAAJMetaFactory.getInstance(SAAJMetaFactory.java:94)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:138)
触发者:
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
所以我明白MessageFactory使用了sun包
static private final String DEFAULT_META_FACTORY_CLASS =
"com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl";
但是我完全不知道为什么打包到可运行的 JAR 后找不到这个类。任何提示或指示将不胜感激。
我刚刚将以下依赖项添加到我的项目中:
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.5.1</version>
</dependency>
如果您使用的版本早于 1.5.1,则需要使用以下行创建文件
META-INF/services/javax.xml.soap.SAAJMetaFactory
以提供 SAAJ 工厂类的完全限定名称,并且它有效:
com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl
javax.xml.soap.saaj-api 似乎已被放弃。 很奇怪的是,一个名为
com.sun
的包才可以工作。
无论如何,它有效。
将我的jdk切换到11后,我遇到了同样的问题。 将 apache.cxf jar 升级到 3.5.1 解决了我的问题。正在使用 3.1.2 和 jdk 1.8
我正在使用 Java 11,此外
implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'
添加
implementation group: 'javax.xml.soap', name: 'javax.xml.soap-api', version: '1.4.0'
但是必须关闭
implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'
我通过添加以下两个依赖项解决了问题
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>saaj-api</artifactId>
<version>1.3.5</version>
</dependency>
我正在使用 Spring Boot 2.4.0 和 Java 11。这对我有用:
implementation 'javax.xml.ws:jaxws-api:2.3.1'
implementation 'javax.jws:javax.jws-api:1.1'
implementation 'com.sun.xml.messaging.saaj:saaj-impl:1.5.1'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.2'
上面的答案(添加 saaj-impl 和 saak-api)适用于大多数项目,但我发现如果您的项目依赖于 javax.xml webservices-api,您还需要删除该依赖项才能停止获取Java 11 中的错误。
Maven 中remove的依赖示例:
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>2.0.1</version>
</dependency>
如果您使用的是 Weblogic,请更改 weblogic.xml 文件中参数
prefer-web-inf-classes
的值。
这对我有用。
另一个让它发挥作用的答案......
我正在从 Springboot2 更改为版本 3。我包含了一个使用一些 SOAP 请求的库。为了解决这个问题,我必须包含这些two罐子:
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.3</version>
</dependency>
没有
jaxb-impl
人工制品给了我一个例外:java.lang.NoClassDefFoundError; message=com/sun/xml/bind/api/TypeReference
。我只是查了一下缺少的类包含在哪个 Jar 中。只是 pom versions 的设置对我有用。列出了较新的库,但它们不起作用,但会导致异常。 Houcem Berrayana 在另一条评论中提出了一个公平的问题,为什么只是这个版本确实有效,但没有更大的主要版本......