将SoapHeader添加到org.springframework.ws.WebServiceMessage

如何将对象添加到org.springframework.ws.WebServiceMessage的soap标头中

这是我希望最终得到的结构:

    username password   

基本上,您需要在客户端中使用WebServiceMessageCallback在创建消息之后但在发送之前修改消息。 @skaffman已经非常准确地描述了代码的其余部分,所以整个东西看起来像这样:

 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("\n + "+username+"\n + "+password"+\n + "); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(headerSource, header.getResult()); } catch (Exception e) { // exception handling } } }); } 

就个人而言,我发现Spring-WS很难满足这样的基本需求,他们应该修复SWS-479 。

你可以这样做:

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

然后

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

您需要将WebServiceMessage getSoapHeader()SoapMessage ,它具有可用于修改标头的getSoapHeader()方法。 反过来, SoapHeader有各种添加元素的方法,包括getResult() (可以用作Transformer.transform()操作的输出)。