Java SOAP版本1.2的SpringWS设置SOAPAction头

Java SOAP版本1.2的SpringWS设置SOAPAction头,java,web-services,soap,spring-ws,Java,Web Services,Soap,Spring Ws,我必须使用SpringWS连接到SOAP1.2Web服务,但在设置服务所需的SOAPAction头时遇到了困难。我已经看过了,但似乎没有一个解决方案适用于我的情况 我收到一条错误消息,基本上说明SOAPAction不能为空。(如果需要,我将发布实际的错误消息) WebServiceTemplate的默认行为似乎是将头作为空字符串发送 我对WebServiceTemplate使用了两种方法来设置操作 与webServiceTemplate#sendAndReceive()一起使用 使用手动设置回调

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

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

WebServiceTemplate的默认行为似乎是将头作为空字符串发送

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

  • 与webServiceTemplate#sendAndReceive()一起使用
  • 使用手动设置回调中的标头
  • 选项1没有任何作用。选项2设置标题,但仅临时设置。如果我在回调中记录getSoapAction()调用,我可以看到它已设置,但它不会发送到任何地方。至少不像我怀疑的那样,服务需要一个单独的标题

    我挖掘了一些源代码,事实上,它将动作设置为内容类型标题的一部分,根据我阅读的一些参考资料,这是正确的行为。问题是,我也看不到内容类型标题中的操作

    其他SO问题的答案是,Saaj实现中存在一个bug,导致忽略对操作头的更改。基于问题时间戳,我希望它能够针对正在使用的版本进行修复

    出于调试目的,我正在使用我创建的SoapUI模拟。我无法访问实际WS实现的源代码或日志。我相信它使用.NET/WCF,如果这有什么不同的话

    所以,这一切归结为一个简单的问题:如何使用SpringWS设置SOAP1.2的SOAPAction头


    我使用的是SpringWS的2.1.4版本,但不是SpringCoreVersion3.2.4等的默认依赖项,而是手动为相同的libs设置依赖项,但针对版本3.2.7。这样做的原因是,我希望使用与Grails 2.3.6完全相同的Spring版本来集成此组件。

    一个单独的
    SOAPAction
    头仅在SOAP1.1中使用。在SOAP1.2中,该操作应设置为
    内容类型
    标题中的一个参数,如您所见,SpringWS包含设置该参数所需的代码

    如果该参数丢失,则很可能是SAAJ的问题。我在Java1.6中的SAAJ实现中遇到了这个问题。解决方法是将较新的SAAJ版本打包到应用程序中


    如果这仍然没有帮助,那么您唯一的选择就是进行一些调试,以确定在哪里重置
    内容类型
    标题。

    我也遇到了这个问题,并找到了解决方案: 您可以单击此url: 你会看到

    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;
    }
    
    从这个演示中


    这就是答案

    使用最新版本的SAAJ修复了此问题。在web容器中使用最新版本是另一回事……出于好奇,您正在使用的servlet容器是什么?您遇到了什么问题?我必须在Websphere 7.X上部署该应用程序。将最新的SAAJ与我的应用程序捆绑在一起没有任何效果。根据到目前为止的调查,似乎SAAJ是在非常早期的阶段由Websphere加载的。更改应用程序的类加载设置(父级上次)没有帮助。我还相信WebSphereSAAJ包含在其他一些jar中。事实上,WAS7.X有一个SAAJ版本,其中不存在此问题。因此,任何阅读本文的人:即使单元/集成测试失败,也要在实际服务器上进行测试:)