I am using Spring-WS and WebServiceTemplate to call SOAP WebService. Currently, i am facing issue while updating SOAP header.
Below is complete structure of SOAP request:
<SOAP:envlope>
<SOAP:Header>
<Security>
<username>?</username>
<password>?</password>
</Security>
<MessageData>
<ClientIP>?</ClientIP>
</MessageData>
</SOAP:Header>
<SOAP:Body>
<Login/>
</SOAP:Body>
</SOAP:envlope>
As shown above, i need to include 2 elements in Header. I have below code to update the Header of SOAP for WebServiceTemplate
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new StringSource(soapHeaderStr), ((SoapMessage) message).getSoapHeader().getResult());
But i got below error message when i tried to update header with two elements (String):
SOAPHeaderString
<Security>
<username>?</username>
<password>?</password>
</Security>
<MessageData>
<ClientIP>?</ClientIP>
</MessageData>
Error
[Fatal Error] :1:197: The markup in the document following the root element must be well-formed.
ERROR: 'The markup in the document following the root element must be well-formed.'
The reason is that there is no root element for Security
and MessageData
elements and it shouldn't be.
Please help how can i update header in such case?
Thanks
Had the same problem and managed to solve it, see here
Basically You can marshal the two elements directly into the soap header like this instead of tying to use a Transformer :
The marshaller mentioned here is a "org.springframework.oxm.jaxb.Jaxb2Marshaller" The element 1 and 2 above are the JAXB elements created using the generated Object factory class.
Finally, resolved it !!
I added dummy root while transformation and then removed that dummy root from SOAP Header.