Spring WS客户端添加了SoapHeader

dan*_*nik 5 spring soap spring-ws java-ee

我正在尝试使用soap标头发送SOAP请求,如下所示:

<SOAP-ENV:Header>
<Security xmlns="http://www.xxx.org/xxx/2003/05">
<UsernameToken><Username>yyyy</Username><Password>xxx</Password>
</UsernameToken></Security></SOAP-ENV:Header>
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我正在使用添加标题元素 SoapActionCallback

SoapActionCallback actionCallBack = new SoapActionCallback("https://aaa.com/bbb.asmx") {
            public void doWithMessage(WebServiceMessage msg) {
                SoapMessage smsg = (SoapMessage) msg;
                smsg.setSoapAction("http://www.xxx.org/yyy/2003/05/SessionCreate");
                SoapHeaderElement security = smsg.getSoapHeader().addHeaderElement(new QName("http://www.xxx.org/yyy", "Security"));
                security.setText("<UsernameToken><Username>yyyy</Username><Password>xxx</Password></UsernameToken>");
            }
        };
Run Code Online (Sandbox Code Playgroud)

我的问题是soap标题看起来像这样

<SOAP-ENV:Header><Security xmlns="http://www.xxx.org/yyy/2003/05">&lt;UsernameToken&gt;&lt;Username&gt;yyyyy&lt;/Username&gt;&lt;Password&gt;xxxx&lt;/Password&gt;&lt;/UsernameToken&gt;</Security></SOAP-ENV:Header>
Run Code Online (Sandbox Code Playgroud)

结果我的请求失败了:

如何正确添加此消息?

Cha*_*had 3

我也想要同样的东西。然而,正如我自己的搜索所示,Spring 没有像 java 中的 SOAPMessage 那样的完整功能。您可能需要的是标头的 addChildElement() 。

我最终放弃了 SoapMessage 大楼并采用了以下方法:

SOAPMessage message = MessageFactory.newInstance();
private void buildHeader(String userName, String password) throws SOAPException{
    SOAPHeader header = message.getSOAPHeader();
    QName authHeader = new QName(SCHEMA, "AuthenticationHeader", SCHEMA_PREFIX);
    SOAPHeaderElement authElement = header.addHeaderElement(authHeader);

    QName userNameHeader = new QName(SCHEMA, "UserName", SCHEMA_PREFIX);
    SOAPElement userElement = authElement.addChildElement((userNameHeader));
    userElement.setTextContent(userName);

    QName passwordHeader = new QName(SCHEMA, "Password", SCHEMA_PREFIX);
    SOAPElement passwdElement = authElement.addChildElement(passwordHeader);
    passwdElement.setTextContent(password);


}
Run Code Online (Sandbox Code Playgroud)

请注意,通过上述方法,使用 sendSourceAndReceiveToResult 传递 SOAPMessage 会将 SOAPMessage 包装在另一个信封中,这不是我们想要的。:(

更新(10/25/2013):我在另一个讨论中找到了这个解决方案。这有点模糊,但值得研究。我会尝试在我这边测试一下。我的一位同事尝试了 spring-integration-ws 并在 google 中查找该主题和肥皂头,得到了一些有前途的资源。

更新(10/25/2013):在闲逛这个库之后,我发现有一种更快的方法可以使用以下方法将 SOAPMessage 包装到 Spring 的 SoapMessage 中:

// message is a SOAPMessage object with custom headers
SoapMessage soapMessage = new SaajSoapMessage(message);
soapMessage.writeTo(System.out);
Run Code Online (Sandbox Code Playgroud)

也许在你构建你的soapmessage之后你可以将它路由到spring-ws等等。