How i can set header in spring-ws client

Viewed 187

When i try to call a service using webserviceTemplate of spring i get:

Caused by: org.springframework.ws.soap.client.SoapFaultClientException: Failed to assert identity with UsernameToken.

THIS IS THE CLASS I USE TO MAKE THE HEADER

package it.ita.Client;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.core.WebServiceMessageCallback;
import org.springframework.ws.soap.saaj.SaajSoapMessage;

import javax.xml.soap.*;

public class TokenHeaderRequestCallback implements WebServiceMessageCallback {

    private static final Logger logger = LoggerFactory.getLogger(TokenHeaderRequestCallback.class);

    private String username;
    private String password;

    public TokenHeaderRequestCallback(String username, String password){
        this.username = username;
        this.password = password;
    }

    public void doWithMessage(WebServiceMessage message) {

        try {
             System.out.println(message.toString());

            SaajSoapMessage saajSoapMessage = (SaajSoapMessage)message;
            SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
            SOAPPart soapPart = soapMessage.getSOAPPart();
            SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
            System.out.println("prima ---->  "+soapEnvelope.toString());

            SOAPHeader soapHeader = soapEnvelope.getHeader();

            Name headerElementName = soapEnvelope.createName(
                    "Security",
                    "wsse",
                    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
            );

            SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerElementName);

            SOAPElement usernameTokenSOAPElement = soapHeaderElement.addChildElement("UsernameToken", "wsse");

            SOAPElement userNameSOAPElement = usernameTokenSOAPElement.addChildElement("Username", "wsse");
            logger.info(this.username);

            userNameSOAPElement.addTextNode(this.username);

            SOAPElement passwordSOAPElement = usernameTokenSOAPElement.addChildElement("Password", "wsse");

            passwordSOAPElement.addTextNode(this.password);

            soapMessage.saveChanges();

            System.out.println("dopo ---->  "+soapEnvelope.toString());
        } catch (SOAPException soapException) {

            throw new RuntimeException("TokenHeaderRequestCallback", soapException);
        }
    }
}

AND I CALL THE SERVICES IN THIS WAY:

JAXBElement res = (JAXBElement) getWebServiceTemplate().marshalSendAndReceive(request,new TokenHeaderRequestCallback("userfrab","hdgdhdgdhdg"));

I've googled but not able to find anything useful, can you give me some help?

0 Answers
Related