Unable to create SAAJ meta-factory after packaging as JAR
Asked Answered
M

10

32

For testing an application I am creating SOAP messages. This works when run directly from Eclipse (Oxygen.1a) but after packaging as runnable jar (option: package required libraries into generated jar) I get the following error:

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)

triggered by:

MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

So I understand that the MessageFactory uses a sun package

static private final String DEFAULT_META_FACTORY_CLASS =
    "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl";

But I am absolutly clueless as to why it is unable to find this class after packaging to a runnable JAR. Any hints or directions would be greatly apreciated.

Mateya answered 9/11, 2017 at 10:46 Comment(5)
Do you have this class "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl" in jar file or in classpath?Sommelier
If I include the referenced file as as jar file (mvnrepository.com/artifact/com.sun.xml.messaging.saaj/saaj-impl/…) it works after beeing packaged. So to rephrase: I do not understand why it works in eclipse without that library.Mateya
Probably eclipse has its own classpath built. You can try print it at the runtime and compare the results.Sommelier
Well @Michal, you are on to something... I could not run the sample that prints the classpath on runtime after packaging it to a JAR either (eclipse ran fine)... So I uninstalled JDK 9. Both the classpath thing and the actual SOAP call work great on the latest JDK8 (which eclipse still had as default).Mateya
I got this error when switching to Java 11. #54574498Buzzard
K
56

I just added the following dependency to my project:

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.1</version>
</dependency>                

If you are using a version older than 1.5.1, you need to create the file META-INF/services/javax.xml.soap.SAAJMetaFactory with the following line to provide the fully-qualified name of the SAAJ factory class and it worked:

com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl

The javax.xml.soap.saaj-api seems to be abandoned. And it's very strange that a package named com.sun is the one to work. Anyway, it works.

Kitchenmaid answered 15/9, 2018 at 21:45 Comment(9)
I tested this, porting from Java 8 to JDK 11. It solved the problem, running in Tomcat 9Untwine
Where did you find out that javax.xml.soap.saaj-api is depecated?Syncopated
I am in a similar situation to @mico, upgrading from 1.6 to 11 and Tomcat 7/GlassFish 3 to Tomcat9. This answer almost did the trick for me, but I kept getting org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR exceptions. The problem went away when I downgraded saaj-impl to version 1.3. See this answerSyncopated
@JorgeYanesDiez, I said it seems to be deprecated. The com.sun.xml.messaging.saaj.ssaj-impl was updated in Oct, 2018 and the javax.xml.soap.saaj-api in Mar, 2013. And using the javax.xml.soap.saaj-api, it doesn't work.Kitchenmaid
Note that if you update to the 1.5.1 version of the jar, there is no requirement to create the META-INF/services/javax.xml.soap.SAAJMetaFactory fileGreasepaint
I applied the answer but was not enough. It was fixed for me after I added saaj-api (1.3.5 version) along with saaj-impl (1.5.2)Finalist
This link was helped: https://mcmap.net/q/454494/-using-wss4jsecurityinterceptor-throws-a-wrong_document_err-a-node-is-used-in-a-different-document-than-the-one-that-created-itHypocaust
This worked for me. I was facing the issue while consuming a SOAP API inside my app (SpringBoot war) running in Tomcat 8.5 and JRE 8. SpringBoot App which is on JDK 1.8 was successfully consuming the SOAP API but when deployed to Tomcat was giving this errors.Spiraea
I ran into the issue upgrading from Springboot2 to Springboot3. Unluckily, it did not help me.Gownsman
T
2

I'm using Java 11 and in addition to the

implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'

add

implementation group: 'javax.xml.soap', name: 'javax.xml.soap-api', version: '1.4.0'

but necessarily turn off implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'

Tatum answered 28/7, 2021 at 20:53 Comment(1)
Could you explain how to perform your last statement more clearly?Portiaportico
A
2

After switching my jdk to 11,I had same problem. Uppgrading apache.cxf jar to 3.5.1 solved my problem.Was using 3.1.2 with jdk 1.8

Aquarius answered 7/4, 2022 at 12:30 Comment(0)
R
1

I have solved the problem by adding the following two dependencies

   <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>
Roots answered 1/9, 2020 at 10:55 Comment(1)
I don't understand why it works with 1.5.1 and not 2.0.1 ?!Downswing
D
1

I'm using Spring Boot 2.4.0 and Java 11. This is what worked for me:

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'
Deflexed answered 4/12, 2020 at 22:38 Comment(1)
This was worked for me too on Spring Boot 2.7.8 and Java 17Lavinalavine
G
1

Yet another answer to get it working...

I am changing from Springboot2 to Version 3. I included a lib which uses some SOAP requests by/within an externally delivered Jar.
In order to solve the issue I have to include these two jars:

    <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>

Not having the jaxb-impl artefact got me an Exception: java.lang.NoClassDefFoundError; message=com/sun/xml/bind/api/TypeReference. I just looked up in what Jar the missing class is contained.
Also see https://mcmap.net/q/454495/-java-lang-noclassdeffounderror-com-sun-xml-bind-api-typereference

Just this setting of pom versions does work for me. There are newer libs listed but they don't work but lead to Exceptions. Fair question by Houcem Berrayana in another comment why just this version does work but no greater major one...

Gownsman answered 13/9, 2023 at 9:29 Comment(1)
Thanks that worked for me on Spring boot 3 and java 17 and added these dependencies implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' implementation 'javax.xml.ws:jaxws-api:2.3.1' implementation 'jakarta.jws:jakarta.jws-api:1.1.1' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2' implementation 'com.sun.xml.messaging.saaj:saaj-impl:1.5.3' implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.2' `implementation 'com.sun.xml.bind:jaxb-impl:2.3.3'``Gasholder
W
0

The answers above (adding saaj-impl and saak-api) work for most projects, but I found out that if your project has a dependency on javax.xml webservices-api, you also need to remove that dependency in order to stop getting that error in Java 11.

Exemple of the dependency to remove in Maven :

   <dependency>
     <groupId>javax.xml</groupId>
     <artifactId>webservices-api</artifactId>
     <version>2.0.1</version>
   </dependency>
Wheaton answered 7/7, 2021 at 16:1 Comment(2)
Doesn't the dependency add a package instead of removing it?Gownsman
i think the idea behind this comment is to check for this dependency, and if you find it, you are supposed to remove it.Akene
T
0

If you are using Weblogic, change the value of the parameter prefer-web-inf-classes at weblogic.xml file. It worked for me.

Tallow answered 22/7, 2022 at 6:57 Comment(0)
C
0

Use the latest "saaj-impl" maven dependency to resolve this issue.

com.sun.xml.messaging.saaj saaj-impl 3.0.3

As the "com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl" is not found, it is looking for default fallback package "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl".

Carberry answered 23/11, 2023 at 13:0 Comment(0)
C
0

for JDK greater 11, You can use the latest version of saal-impl given below:

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>javax.xml.soap</groupId>
    <artifactId>saaj-api</artifactId>
    <version>1.3.5</version>
</dependency>
Cardioid answered 31/5 at 6:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.