Search code examples
javaweb-servicesspringsoapspring-ws

Add SoapHeader to org.springframework.ws.WebServiceMessage


How can I add an object into the soap header of a org.springframework.ws.WebServiceMessage

This is the structure I'm looking to end up with:

 <soap:Header>
    <credentials xmlns="http://example.com/auth">
      <username>username</username>
      <password>password</password>
    </credentials>
  </soap:Header>

Solution

  • Basically, you need to use a WebServiceMessageCallback in your client to modify the message after its creation but before it is sent. To rest of the code has been described pretty accurately by @skaffman so the whole stuff might look like this:

    public void marshalWithSoapActionHeader(MyObject o) {
    
        webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() {
    
            public void doWithMessage(WebServiceMessage message) {
                try {
                    SoapMessage soapMessage = (SoapMessage)message;
                    SoapHeader header = soapMessage.getSoapHeader();
                    StringSource headerSource = new StringSource("<credentials xmlns=\"http://example.com/auth\">\n +
                            <username>"+username+"</username>\n +
                            <password>"+password"+</password>\n +
                            </credentials>");
                    Transformer transformer = TransformerFactory.newInstance().newTransformer();
                    transformer.transform(headerSource, header.getResult());
                } catch (Exception e) {
                    // exception handling
                }
            }
        });
    }
    

    Personally, I find that Spring-WS sucks hard for such a basic need, they should fix SWS-479.