Fondamentalement, vous devez utiliser un WebServiceMessageCallback
dans votre client pour modifier le message après sa création mais avant qu'il ne soit envoyé. Pour le reste du code a été décrit assez précisément par @skaffman si l'ensemble des choses pourrait ressembler à ceci:
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
}
}
});
}
Personnellement, je trouve que le printemps-WS suce dur pour un tel besoin de base, ils devraient fixer SWS-479.
Spring-WS est à peu près une opération d'un homme, et Arjen n'est pas tout à fait aussi influençable que le reste d'entre eux: – skaffman
Merci Pascal, ça marche parfaitement. J'ai fini par utiliser javax.xml.bind.util.JAXBSource au lieu de StringSource comme ceci: JAXBSource headerSource = new JAXBSource (jaxbContext, credentials); –
@skaffman En effet :) –