Spring WebServiceTemplate SOAPAction missing in HT

2019-05-01 05:04发布

问题:

I am having difficulty in calling a SOAP 1.2 WebService via Spring-ws WebServiceTemplate. The request being made is missing SOAPAction in Http Header and the server throws an error with "Unable to handle request without a valid action parameter. Please supply a valid soap action." I was able to figure out SOAP Action was missing by monitoring through wireshark. I am also not behind any proxy.

I have made sure that the SOAP XML I am trying to send is valid by running the request through TCP Mon ( tool like SOAP UI) and was able to get response.

Here is my spring config:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/util
                        http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="soapVersion">
    <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
    </property>
</bean>

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
 <constructor-arg ref="messageFactory" />
<property name="defaultUri" value="https://ecomapi.networksolutions.com/soapservice.asmx" />
<property name="messageSender">
    <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender" />     </property>
</bean>

And this is my java code:

            public void simpleSendAndReceive() {
            try{
            StreamSource source = new StreamSource(new StringReader(MESSAGE));
            StreamResult result = new StreamResult(System.out);
            SoapActionCallback actionCallBack = new SoapActionCallback("https://ecomapi.networksolutions.com/soapservice.asmx") {
                public void doWithMessage(WebServiceMessage msg) {
                    SoapMessage smsg = (SoapMessage)msg;
                    smsg.setSoapAction("http://networksolutions.com/ReadOrder");
                }
            };
            webServiceTemplate.sendSourceAndReceiveToResult(
                    "https://ecomapi.networksolutions.com/soapservice.asmx",
                     source,
                     new SoapActionCallback("http://networksolutions.com/ReadOrder"),
     //                      actionCallBack,
                     result);


            System.out.println(source.getInputStream().toString());
            System.out.println(result.getWriter().toString());

            }catch (SoapFaultClientException e) {
                System.out.println(e.getFaultCode());
                System.out.println(e.getFaultStringOrReason());
                System.out.println(e.fillInStackTrace().getLocalizedMessage());
            } catch (WebServiceIOException we) {
                System.out.println(we.getRootCause());
            }
        }

回答1:

I faced the same problem and I traced it back to a bug in the 1.3.2 version of the com.sun.xml.messaging.saaj.soap.MessageImpl implementation (http://java.net/jira/browse/SAAJ-37). I upgraded to the 1.3.19 version and all was fine.

The Issue:-

Before writing the request to the output stream, the saveChanges() method is called. The 1.3.2 version of this class was overwriting the 'Content-Type' request header in it's implementation of the 'saveChanges' method.



回答2:

I had a similar issue which was due to the namespace of the XmlSchema annotation in the package-info.java file being different from what the soap service I was trying to call expected. This resulted from me using xjc to generate the jaxb request and response objects from a xsd that I had sewn together from the wsdl parts plus the xsd header from a previous service I was interfacing so it was a pure cut and paste error on my part but the previous answer on here about the namespace was what clued me in to my error quickly.



回答3:

SOAPAction is mandatory only in SOAP 1.1, see section Content Type.

The SOAP 1.1 mandatory SOAPAction HTTP header has been removed in SOAP 1.2. In its place is an optional action parameter on the application/soap+xml media type.