Pregunta

¿Cómo puedo añadir un objeto en la cabecera de un jabón 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>
¿Fue útil?

Solución

Básicamente, es necesario utilizar un WebServiceMessageCallback en su cliente para modificar el mensaje después de su creación, pero antes de que sea enviado. 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
            }
        }
    });
}

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

Otros consejos

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

Es necesario emitir el WebServiceMessage a SoapMessage, que tiene un método getSoapHeader() puede utilizar para modificar el encabezado. A su vez, SoapHeader tiene varios métodos para añadir elementos, incluyendo getResult() (que puede ser utilizado como la salida de una operación de Transformer.transform()).

respuesta de respuesta = (Respuesta) getWebServiceTemplate ()               .marshalSendAndReceive (request, nuevo HeaderModifier ());

Crea HeaderModifier clase y anular doWithMessage HeaderModifier clase pública implementa WebServiceMessageCallback {

 private static PrintStream out = System.out;

@Override
public void doWithMessage(WebServiceMessage message) throws IOException {
      SaajSoapMessage soapMessage = (SaajSoapMessage) message;

            SoapEnvelope soapEnvelope = soapMessage.getEnvelope();
            SoapHeader soapHeader = soapEnvelope.getHeader();

            //Initialize QName for Action and To 
            QName action = new QName("{uri}","Action","{actionname}");
            QName to = new QName("{uri}","To","{actionname}");


            soapHeader.addNamespaceDeclaration("{actionname}", "{uri}");


            SoapHeaderElement soapHeaderElementAction = soapHeader.addHeaderElement(action);
            SoapHeaderElement soapHeaderElementTo =  soapHeader.addHeaderElement(to);



            soapHeaderElementAction.setText("{text inside the tags}");


            soapHeaderElementTo.setText("{text inside the tags}");


            soapMessage.setSoapAction("{add soap action uri}");


            soapMessage.writeTo(out);

}

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top