首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring客户端添加SoapHeader

Spring客户端添加SoapHeader
EN

Stack Overflow用户
提问于 2013-10-02 15:07:33
回答 1查看 7.1K关注 0票数 5

我试图用SOAP头发送soap请求,如下所示:

代码语言:javascript
复制
<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添加标头元素

代码语言:javascript
复制
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头看起来像这样

代码语言:javascript
复制
<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>

结果,我的请求失败了:

我怎样才能正确地添加这条信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 03:11:37

我也要一样的东西。但是,正如我在自己的搜索中所看到的那样,Spring没有像java中的SOAPMessage那样的完整功能。您可能需要的是头部的addChildElement()。

最后,我放弃了SoapMessage大楼,就这样做了:

代码语言:javascript
复制
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);


}

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

更新(10/25/2013):我在另一次讨论中发现了this solution。这有点模糊,但值得一查。我会试着在我的头上测试一下。我的一位同事尝试了spring-integration-ws,并在google中寻找这个主题,soap头产生了一些有希望的资源。

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

代码语言:javascript
复制
// message is a SOAPMessage object with custom headers
SoapMessage soapMessage = new SaajSoapMessage(message);
soapMessage.writeTo(System.out);

也许,在您构建了soapmessage之后,您可以将其路由到spring等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19140265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档