![](/img/trans.png)
[英]Support both SOAP 1.1 and SOAP 1.2 messages in Spring-WS
[英]Spring-WS set SOAPAction header for SOAP version 1.2
我必须使用Spring-WS连接到SOAP 1.2 Web服务,但是在设置服务所需的SOAPAction标头时遇到了困难。 我已经在这里和那里看过了 ,但是似乎没有人提供适用于我的情况的解决方案。
我收到一条错误消息,基本上指出SOAPAction不能为空。 (如果需要,我会发布实际的错误消息)
WebServiceTemplate的默认行为似乎是将标头作为空String发送。
我对WebServiceTemplate使用了两种方法来设置操作
SoapActionCallback
与webServiceTemplate#sendAndReceive()结合使用 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.