2017-02-28 160 views
0

我目前正在用Spring WS開發SOAP客戶端。我跟着指南/教程,一切工作正常。除了一件事情,錯誤處理。Spring WS客戶端處理HTTP錯誤

我無法控制我發送消息的SOAP端點。所以我想在事情出錯的情況下做一些很好的異常處理。我在沒有指望的測試場景中遇到了一些HTTP錯誤。我不知道如何處理它們。

例如:

我發送SOAP消息到錯誤的URL。其中返回HTTP 405方法不允許。 (我發送POST到僅GET的URL,這是一個配置錯誤,但仍然是一個錯誤)。 在正文中實際上是來自SOAP端點的HTML錯誤頁面。當然,Spring不能處理這個消息並拋出一個異常。在堆棧跟蹤中,它顯然是405.但我想提取返回的錯誤代碼並以其他方式記錄(或者將它發回給發送SOAP消息請求的用戶)。

這些是發送SOAP消息後,我收到一些日誌消息(省略了其它記錄):

org.apache.http.wire      : << "HTTP/1.1 405 Method Not Allowed[\r][\n]" 
o.a.h.impl.conn.DefaultClientConnection : Receiving response: HTTP/1.1 405 Method Not Allowed 
org.apache.http.headers     : << HTTP/1.1 405 Method Not Allowed 

是否有任何方式來捕捉和提取這些HTTP錯誤代碼? 如果需要更多信息,請詢問。我願意提供儘可能多的信息,但我不知道此時還要發佈什麼內容。

編輯:或者有什麼辦法用集成測試來模擬/測試這個嗎?我無法繼續發送消息到真正的SOAP端點。我從集成測試中得不到與真實測試相同的輸出(引導應用程序並將消息發送到真正的SOAP端點)。我已經將集成測試的日誌記錄級別設置爲與真實測試環境相同。

謝謝!

回答

0

您可以通過擴展Sp​​ring WebServiceTemplate並重寫handleError方法並添加自定義實現來創建自己的wsTemplate。

不知道是什麼版本您使用,但一個共同的默認實現是這樣的:

protected Object handleError(WebServiceConnection connection, WebServiceMessage request) throws IOException { 
    if (logger.isDebugEnabled()) { 
     logger.debug("Received error for request [" + request + "]"); 
    } 
    throw new WebServiceTransportException(connection.getErrorMessage()); 
} 

更有力,更希望的辦法是寫自己的org.springframework.ws.client.support.interceptor.ClientInterceptor,並通過setInterceptors在wsTemplate設置方法。不確定你能從MessageContext對象中得到什麼足以滿足你的需求,但是所有的soap故障都將以這種方式被攔截。

public class MyClientInterceptor implements ClientInterceptor { 

    public boolean handleFault(MessageContext messageContext){ 
     // custom implementation 
    } 

    public boolean handleRequest(MessageContext messageContext){ 
     return true; 
    } 

    public boolean handleResponse(MessageContext messageContext){ 
     return true; 
    } 
} 
+0

我試過這個實現,它似乎工作,但不是最佳。我嘗試在此方法中實現'log.error(「Error message:」+ webServiceConnection.getErrorMessage());''。它在我的日誌中記錄以下錯誤:'錯誤消息:[405]'。我將不得不從getErrorMessage()返回的字符串中去掉響應代碼。我實際上想要捕獲HTTP頭,它的HTTP響應代碼由'org.apache.http.headers'記錄,因爲它看起來更健壯。任何方式來做到這一點? – Clemenz

+0

我編輯了我的答案,不知道您是否需要特定的狀態代碼,或僅僅通過檢測soap故障就足以滿足您的要求。 – artemisian

+0

問題是,soap端點沒有返回SOAP錯誤。但實際的HTTP錯誤代碼與HTML錯誤頁面。這就是爲什麼我需要捕獲HTTP返回代碼,以檢查它是否是4xx或5xx。因爲我不打算解析HTML文件。我已經在試用ClientInterceptor。也許今天我會得到一個解決方案。感謝壽! – Clemenz