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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-WS为SOAP版本1.2设置SOAPAction头相关的知识,希望对你有一定的参考价值。

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

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

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

我已经使用WebServiceTemplate的两种方法来设置操作

  1. 使用SoapActionCallback和webServiceTemplate#sendAndReceive()
  2. 使用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 或两者)

SOAP1.1 VS SOAP1.2

如何用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

axis2设置soap1.1或soap1.2协议