2016-12-07 107 views
1

只要在我的駱駝路線中有正常流量,我就可以在下一個組件中獲取正文。但是,無論何時出現異常(Http 401或500),我都無法獲得異常內容。我只是在我的服務器日誌中得到一個java異常。 我也嘗試onException()..使用該流進入它的錯誤,但我仍然沒有得到由Web服務發送的錯誤響應正文(當我直接使用POSTMAN時),我只得到我發送給Web服務的正文中的請求。阿帕奇駱駝:無法得到異常體

還加入了路線:

from("direct:contractUpdateAds") 
     .to("log:inside_direct:contractUpdateAds_route_CompleteLog?level=INFO&showAll=true&multiline=true") 
     .streamCaching() 
     .setHeader(Exchange.HTTP_METHOD, constant("POST")) 
     .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) 
     .log("before calling ADS for ContractUpdate:\nBody:${body}") 
     .to("{{AdsContractUpdateEndpoint}}") 
     .log("after calling ADS for ContractUpdate:\nBody:${body}") 
     .convertBodyTo(String.class) 
     .end(); 
+0

你應該提到你使用的組件,使HTTP調用('駱駝http','駱駝http4','駱駝jetty' ...)。 –

+0

我正在使用camel-http – rohan

+0

你能提供整個流程的代碼嗎?另外,你如何獲取異常體? –

回答

3

選項1:處理失敗狀態代碼自己

throwExceptionOnFailure=false endpoint option(可至少camel-httpcamel-http4終點)可能是你想要的東西。使用此選項,camel-http將不再將HTTP狀態> = 300視爲錯誤,並且會讓您決定要執行的操作 - 包括處理響應主體,但您認爲合適。

類似的規定應該工作:

from("...") 
.to("http://{{hostName}}?throwExceptionOnFailure=false") 
.choice() 
    .when(header(Exchange.HTTP_RESPONSE_CODE).isLessThan(300)) 
     // HTTP status < 300 
     .to("...") 
    .otherwise() 
     // HTTP status >= 300 : would throw an exception if we had "throwExceptionOnFailure=true" 
     .log("Error response: ${body}") 
     .to("..."); 

這是一個有趣的方法,如果你想擁有例如某些碼狀態代碼進行特殊處理。請注意,邏輯可以通過使用direct端點在幾條路線中重複使用,就像任何其他駱駝路由邏輯一樣。

選項2:訪問HttpOperationFailedException在onException的

如果要保持默認的錯誤處理,但你要訪問的響應正文中由於某種原因,異常處理的代碼,你只需要訪問HttpOperationFailedException上的responseBody屬性。

下面是一個例子:

onException(HttpOperationFailedException.class) 
.process(new Processor() { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     // e won't be null because we only catch HttpOperationFailedException; 
     // otherwise, we'd need to check for null. 
     final HttpOperationFailedException e = 
       exchange.getProperty(Exchange.EXCEPTION_CAUGHT, HttpOperationFailedException.class); 
     // Do something with the responseBody 
     final String responseBody = e.getResponseBody(); 
    } 
}); 
+0

謝謝@Cyaegha它的作品。是否有任何其他方法來實際獲取.onException()中的錯誤響應正文。因爲否則我需要在每次調用時單獨應用這個條件。 – rohan

+0

我認爲這是不可能的,但是看代碼,我現在注意到'HttpOperationFailedException'有一個'responseBody'屬性,它被填充(顯然)響應主體...我要編輯我的答案。 –