【问题标题】:Spring WS client add SoapHeaderSpring WS 客户端添加 SoapHeader
【发布时间】:2013-10-02 15:07:33
【问题描述】:

我正在尝试发送带有肥皂头的 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>

为了做到这一点,我使用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>");
            }
        };

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

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

结果我的请求失败了:

如何正确添加此消息?

【问题讨论】:

  • 您知道您可以将任何soap 元素转换为Java 元素或节点,然后获取文档并创建新的节点/元素并将它们附加到您当前的soap 元素中吗?话虽如此,您想要实现的目标可以通过 spring 配置
  • @VirtualTroll 如何展示它是如何做到的,而不是简单地说明它可以做到?看起来这将是一个很好的答案。

标签: spring jakarta-ee soap spring-ws


【解决方案1】:

我也想要同样的东西。但是,正如我自己搜索的那样,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);


}

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

更新(2013 年 10 月 25 日):我在另一个讨论中找到了 this solution。这有点模糊,但值得研究。我会尝试在我的最后测试一下。我的一位同事尝试了 spring-integration-ws 并在 google 中寻找主题和soap headers 产生了一些有希望的资源。

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

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

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

【讨论】:

  • 作为补充解决方案,我也放弃了 Spring-WS 客户端方法,因为必须在 Spring 中编组它们更加麻烦和耗时,这是值得的。无论如何,在 java Saaj 和 JAXB 中这样做更简单。
  • 不确定是否有一种将肥皂消息“路由”到 Spring-WS 的好方法。正在搜索...
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多