spring-ws-test - IllegalArgumentException during request comparison
MHajoha opened this issue · 13 comments
With com.sun.xml.messaging.saaj:saaj-impl:1.5.3
(which is included in spring-boot-starter-web-services:2.4.5), the comparison of expected and actual request throws an IllegalArgumentException
for us:
java.lang.IllegalArgumentException: Cannot find SOAP wrapper for element [SOAP-ENV:Envelope: null]
at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:590)
at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:578)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.lookForEnvelope(SOAPPartImpl.java:155)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:135)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getDocumentElement(SOAPPartImpl.java:430)
at org.custommonkey.xmlunit.DifferenceEngine.compareNode(DifferenceEngine.java:191)
at org.custommonkey.xmlunit.DifferenceEngine.compare(DifferenceEngine.java:130)
at org.custommonkey.xmlunit.Diff.compare(Diff.java:241)
at org.custommonkey.xmlunit.Diff.appendMessage(Diff.java:364)
at org.custommonkey.xmlunit.Diff.toString(Diff.java:378)
at org.springframework.ws.test.support.matcher.SoapEnvelopeDiffMatcher.match(SoapEnvelopeDiffMatcher.java:61)
at org.springframework.ws.test.support.matcher.AbstractSoapMessageMatcher.match(AbstractSoapMessageMatcher.java:40)
at org.springframework.ws.test.client.WebServiceMessageMatcherAdapter.match(WebServiceMessageMatcherAdapter.java:43)
at org.springframework.ws.test.client.MockSenderConnection.send(MockSenderConnection.java:76)
at org.springframework.ws.client.core.WebServiceTemplate.sendRequest(WebServiceTemplate.java:658)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:606)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:373)
at org.example.SpringWsTestReproTest.Should_Work(SpringWsTestReproTest.java:37)
This does not occur with saaj-impl:1.5.2
.
I've created a relatively minimal test to reproduce the issue: https://github.com/MHajoha/spring-ws-test-bug-repro
changes between saaj-impl 1.5.2 and 1.5.3
eclipse-ee4j/metro-saaj@1.5.2...1.5.3
I think it is due to the new cloning behavior.
There are also notable differences with v1.5.2 and 1.5.3 in the type of test
(the actual soap request) in DifferenceEngine.compare. With v1.5.2 it was of type DocumentImpl
- the same type of control
which is the expected soap request. With v1.5.3 it is of type SOAPPart1_1Impl
.
I ran into the exact same issue
same for me
Workaround:
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.5.2</version>
</dependency>
Is there a solution to this problem today other than using saaj-impl:jar:1.5.2
I've patched this issue so things should run properly. It's currently working for Spring WS 4.0.1-SNAPSHOT, which is picked up by Spring Boot 3.0.2-SNAPSHOT.
Spring Boot 2.4 (as mentioned above) hasn't been supported since November 2021, so it won't be visible there. I'll investigate whether this is a candidate for backporting to Spring WS 3.1, which is supported by Spring Boot 2.7. (All version of Spring Boot before 2.7 are no longer supported).
Backported to 3.1.x
.
I am happy to confirm that the error is gone with Spring Boot 2.7.7, saaj-impl 1.5.3 and spring-ws 3.1.5-SNAPSHOT.
I'm still facing this issue using encryption, while i run it on Intellij it works correctly, but when i dockerize it, returns:
java.lang.IllegalArgumentException: Cannot find SOAP wrapper for element [xenc:EncryptedData: null] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:590) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:578) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.ElementImpl.getFirstChildElement(ElementImpl.java:660) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.BodyImpl.getPayloadQName(BodyImpl.java:439) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.BodyImpl.hasFault(BodyImpl.java:151) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at org.springframework.ws.soap.saaj.SaajSoapBody.hasFault(SaajSoapBody.java:55) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.soap.AbstractSoapMessage.hasFault(AbstractSoapMessage.java:62) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.soap.AbstractSoapMessage.getFaultCode(AbstractSoapMessage.java:68) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:94) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:60) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:288) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar!/:5.3.24] 2023-03-12 15:03:10 at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.24.jar!/:5.3.24]
I'm still facing this issue using encryption, while i run it on Intellij it works correctly, but when i dockerize it, returns:
java.lang.IllegalArgumentException: Cannot find SOAP wrapper for element [xenc:EncryptedData: null] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:590) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:578) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.ElementImpl.getFirstChildElement(ElementImpl.java:660) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.BodyImpl.getPayloadQName(BodyImpl.java:439) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at com.sun.xml.messaging.saaj.soap.impl.BodyImpl.hasFault(BodyImpl.java:151) ~[saaj-impl-1.5.3.jar!/:1.5.3] 2023-03-12 15:03:10 at org.springframework.ws.soap.saaj.SaajSoapBody.hasFault(SaajSoapBody.java:55) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.soap.AbstractSoapMessage.hasFault(AbstractSoapMessage.java:62) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.soap.AbstractSoapMessage.getFaultCode(AbstractSoapMessage.java:68) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:94) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:60) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:288) ~[spring-ws-core-3.1.4.jar!/:na] 2023-03-12 15:03:10 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar!/:5.3.24] 2023-03-12 15:03:10 at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.24.jar!/:5.3.24]
Your docker container is using spring-ws-core-3.1.4.jar not 3.1.5
I'm updating a Spring Boot 2.7 project to Spring Boot 3.1.2, and the issue was not present initially, but is there when updating Spring Boot
java.lang.IllegalArgumentException: Cannot find SOAP wrapper for element [SOAP-ENV:Envelope: null]
at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:590)
at com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl.find(SOAPDocumentImpl.java:578)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.lookForEnvelope(SOAPPartImpl.java:155)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:135)
at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getDocumentElement(SOAPPartImpl.java:430)
at org.custommonkey.xmlunit.DifferenceEngine.compareNode(DifferenceEngine.java:191)
at org.custommonkey.xmlunit.DifferenceEngine.compare(DifferenceEngine.java:130)
at org.custommonkey.xmlunit.Diff.compare(Diff.java:241)
at org.custommonkey.xmlunit.Diff.appendMessage(Diff.java:364)
at org.custommonkey.xmlunit.Diff.toString(Diff.java:384)
at org.springframework.ws.test.support.matcher.SoapEnvelopeDiffMatcher.match(SoapEnvelopeDiffMatcher.java:64)
at org.springframework.ws.test.support.matcher.AbstractSoapMessageMatcher.match(AbstractSoapMessageMatcher.java:40)
at org.springframework.ws.test.server.WebServiceMessageMatcherAdapter.match(WebServiceMessageMatcherAdapter.java:42)
at org.springframework.ws.test.server.MockWebServiceClient$MockWebServiceClientResponseActions.andExpect(MockWebServiceClient.java:211)
The thing is that it's not fixable by using saaj-impl 1.5.2 as it's not compatible with 3.X: the following stacktrace occurs if I patch it to use 1.5.2 (the SAAJMetaFactory class is absent from this old version)
java.lang.NoClassDefFoundError: javax/xml/soap/SAAJMetaFactory
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at jakarta.xml.soap.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:60)
at jakarta.xml.soap.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:96)
at jakarta.xml.soap.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:71)
at jakarta.xml.soap.FactoryFinder.newInstance(FactoryFinder.java:136)
at jakarta.xml.soap.FactoryFinder.find(FactoryFinder.java:132)
at jakarta.xml.soap.SAAJMetaFactory.getInstance(SAAJMetaFactory.java:66)
at jakarta.xml.soap.MessageFactory.newInstance(MessageFactory.java:126)
at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.afterPropertiesSet(SaajSoapMessageFactory.java:139)
at org.springframework.ws.support.DefaultStrategiesHelper.instantiateBean(DefaultStrategiesHelper.java:180)
... 105 more
Caused by: java.lang.ClassNotFoundException: javax.xml.soap.SAAJMetaFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 123 more
I tried saaj-impl 3.0.2, 3.0.1 and 3.0.0 but the Cannot find SOAP wrapper for element
issue is there everytime
I'm updating a Spring Boot 2.7 project to Spring Boot 3.1.2, and the issue was not present initially, but is there when updating Spring Boot
I have exactly the same problem. Any ideas how to fix this issues?
saaj-impl 3.0.2
spring-boot-starter-web 3.1.2
spring-ws-test 4.0.5
@PhilippKemkes Hey, I did have a fix now!
So, in fact, there are 2 possible fixes:
- the first one is to wait for the real fix to be integrated in spring-ws-test (see #1370)
- the second one is to reproduce this fix by doing a workaround
To apply the temporary workaround, just follow these steps:
- Get the patch from this gist: https://gist.github.com/AntoineJT/8de3b08168803574b54cacfc5c425288
- Put it wherever you want in your project tests
- Replace all calls to
ResponseMatchers.soapEnvelope
by calls toPatchedSoapResponseMatchers.soapEnvelope
(a search-and-replace in test files will do the thing, then add missing imports, and you're good to go)
Enjoy 😄