繁体   English   中英

Spring-WS为SOAP版本1.2设置SOAPAction标头

[英]Spring-WS set SOAPAction header for SOAP version 1.2

我必须使用Spring-WS连接到SOAP 1.2 Web服务,但是在设置服务所需的SOAPAction标头时遇到了困难。 我已经在这里那里看过 ,但是似乎没有人提供适用于我的情况的解决方案。

我收到一条错误消息,基本上指出SOAPAction不能为空。 (如果需要,我会发布实际的错误消息)

WebServiceTemplate的默认行为似乎是将标头作为空String发送。

我对WebServiceTemplate使用了两种方法来设置操作

  1. SoapActionCallback与webServiceTemplate#sendAndReceive()结合使用
  2. 使用setSoapAction( String s )在回调中手动设置标头

选项1什么也没做。 选项2设置标题,但只是临时的。 如果我在回调中记录getSoapAction()调用,我可以看到它已设置,但是它没有发送到任何地方。 至少不是我认为服务需要的单独标头。

我稍微挖掘了SaajSoapMessage实现的来源,实际上是将操作设置为Content-Type标头的一部分,根据我阅读的一些参考资料,该行为是正确的。 问题是我在Content-Type标头中也看不到该操作。

其他的SO问题有一个答案,指出Saaj实现中存在一个错误,该错误会导致操作标头的更改被忽略。 基于问题的时间戳,我希望它对于所使用的版本是固定的。

出于调试目的,我使用了已创建的SoapUI模拟。 我无权访问实际WS实现的源或日志。 我相信它会使用.NET / WCF(如果有任何区别)。

因此,这全都归结为一个简单的问题: 如何使用Spring-WS为SOAP 1.2设置SOAPAction标头

我使用的是Spring-WS的2.1.4-RELEASE版本,但不是为Spring-core版本3.2.4等的默认依赖项,而是为相同的库手动设置了依赖项,但为3.2.7版本。 原因是我希望具有与Grails 2.3.6一起提供的Spring完全相同的版本,该组件将在其中集成。

我也遇到了麻烦,并找到了解决方案:您可以单击以下URL: https : //spring.io/guides/gs/standing-web-service/您将看到

public GetQuoteResponse getQuote(String ticker) {

    GetQuote request = new GetQuote();
    request.setSymbol(ticker);

    log.info("Requesting quote for " + ticker);

    GetQuoteResponse response = (GetQuoteResponse) getWebServiceTemplate()
            .marshalSendAndReceive("http://www.webservicex.com/stockquote.asmx",
                    request,
                    new SoapActionCallback("http://www.webserviceX.NET/GetQuote"));

    return response;
}

从这个演示中输入图像描述在这里

所以这就是答案!

单独的SOAPAction标头仅在SOAP 1.1中使用。 在SOAP 1.2中,应该将操作设置为Content-Type标头中的参数,并且如您所见,Spring-WS包含设置该参数的必要代码。

如果该参数丢失,则很可能是SAAJ的问题。 我已经看到 Java 1.6中SAAJ实现的问题。 一种解决方法是将最新的SAAJ版本与您的应用程序打包在一起。

如果仍然不能解决问题,那么您唯一的选择是进行一些调试,以找出Content-Type标头的重置位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM