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());
}
}
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.
SOAPAction is mandatory only in SOAP 1.1, see section Content Type.
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.