Spring-WS为SOAP版本1.2设置SOAPAction头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-WS为SOAP版本1.2设置SOAPAction头相关的知识,希望对你有一定的参考价值。
我必须使用Spring-WS连接到SOAP 1.2 Web服务,但是我在设置服务所需的SOAPAction头时遇到了困难。我已经看过here和there,但似乎没有一个解决方案适用于我的情况。
我收到一条错误消息,基本上说SOAPAction不能为空。 (如果需要,我会发布实际的错误消息)
WebServiceTemplate的默认行为似乎是它将标头作为空String发送。
我已经使用WebServiceTemplate的两种方法来设置操作
- 使用
SoapActionCallback
和webServiceTemplate#sendAndReceive() - 使用
setSoapAction( String s )
在回调中手动设置标题
选项1不做任何事情。选项2设置标题,但只是暂时的。如果我在回调中记录getSoapAction()调用,我可以看到它设置,但它不会发送到任何地方。至少不是我怀疑服务需要的单独标题。
我挖了一些SaajSoapMessage implementation的来源,事实上它将动作设置为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集成的完全相同的Spring版本。
单独的SOAPAction
头仅在SOAP 1.1中使用。在SOAP 1.2中,该操作应该被设置为Content-Type
头中的参数,如您所见,Spring-WS包含设置该参数的必要代码。
如果该参数丢失,则很可能是SAAJ的问题。我的seen问题与Java 1.6中的SAAJ实现有关。解决方法是将更新的SAAJ版本与您的应用程序打包在一起。
如果这仍然没有帮助,那么你唯一的选择是做一些调试来找出Content-Type
头重置的位置。
我也遇到了这个问题,并找到了解决方案:你可以点击这个网址:你会看到https://spring.io/guides/gs/consuming-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;
}
从这个演示enter image description here
所以这就是答案!
以上是关于Spring-WS为SOAP版本1.2设置SOAPAction头的主要内容,如果未能解决你的问题,请参考以下文章
Spring-ws 自动生成wsdl 修改请求默认Request后缀的问题
WSDL 能否指示 Web 服务的 SOAP 版本(1.1 或 1.2)?
以编程方式检查 WSDL 文件支持的 SOAP 版本(1.1 或 1.2 或两者)