2010-02-16 25 views
11

¿Cómo puedo añadir un objeto en la cabecera de un jabón org.springframework.ws.WebServiceMessageAñadir SoapHeader a org.springframework.ws.WebServiceMessage

Esta es la estructura que estoy buscando para terminar con:

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

Respuesta

22

Básicamente, necesita utilizar un WebServiceMessageCallback en su cliente para modificar el mensaje después de su creación, pero antes de enviarlo. Para el resto del código se ha descrito con bastante exactitud por @skaffman por lo que toda la materia podría tener este aspecto:

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 
      } 
     } 
    }); 
} 

Personalmente, me parece que la primavera-WS chupa duro para una necesidad tan básica, que debe fijar SWS-479.

+1

Primavera-WS es más o menos una operación de un solo hombre, y Arjen no es tan sugerente como el resto de ellos:) – skaffman

+1

Gracias Pascal, que funciona a la perfección. Terminé usando javax.xml.bind.util.JAXBSource en lugar de StringSource como lo siguiente: JAXBSource headerSource = new JAXBSource (jaxbContext, credentials); –

+0

@skaffman De hecho :) –

3

Debe enviar el WebServiceMessage al SoapMessage, que tiene un método getSoapHeader() que puede usar para modificar el encabezado. A su vez, SoapHeader tiene varios métodos para agregar elementos, incluido getResult() (que se puede usar como salida de una operación Transformer.transform()).

3

Se puede hacer de la siguiente manera:

public class SoapRequestHeaderModifier implements WebServiceMessageCallback { 
private final String userName = "user"; 
private final String passWd = "passwd"; 

@Override 
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { 
    if (message instanceof SaajSoapMessage) { 
    SaajSoapMessage soapMessage = (SaajSoapMessage) message; 
    MimeHeaders mimeHeader = soapMessage.getSaajMessage().getMimeHeaders(); 
    mimeHeader.setHeader("Authorization", getB64Auth(userName, passWd)); 
    } 
} 

private String getB64Auth(String login, String pass) { 
    String source = login + ":" + pass; 
    String retunVal = "Basic " + Base64.getUrlEncoder().encodeToString(source.getBytes()); 
    return retunVal; 
} 
} 

Entonces

Object response = getWebServiceTemplate().marshalSendAndReceive(request, new SoapRequestHeaderModifier());