簡體   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