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.
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
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); –
@skaffman De hecho :) –