2016-12-07 8 views
1

내 낙타 경로에 정상적인 흐름이있을 때마다 다음 구성 요소에서 시체를 얻을 수 있습니다. 하지만 예외 (Http 401 또는 500)가있을 때마다 예외 본문을 가져올 수 없습니다. 난 그냥 내 서버 로그에 자바 예외가 발생합니다. 나는 onException()을 시도했다. 그 흐름을 오류가 들어간다지만, 여전히 나는 (직접 POSTMAN 사용할 때 얻을) 웹 서비스에 의해 보낸 오류 응답 본문을 얻지 않는다, 나는 웹 서비스에 보낸 신체의 요청. Apache Camel : 예외 몸체를 얻을 수 없습니다.

또한 경로를 추가 :

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','낙타 http4','낙타 jetty')는 HTTP 호출을 위해 사용하는 구성 요소를 언급해야한다 :

다음은 예입니다. –

+0

낙타 - http를 사용했습니다 – rohan

+0

전체 흐름에 대한 코드를 제공 할 수 있습니까? 또한, 예외 몸체를 어떻게 가져 오려고합니까? –

답변

3

옵션 1 : 오류 상태 코드 자신에게

을 처리하는 throwExceptionOnFailure=false endpoint option (사용 가능한 적어도 camel-httpcamel-http4 엔드 포인트) 당신이 원하는 아마. 이 옵션을 사용하면 camel-http은 더 이상 HTTP 상태> = 300을 오류로 간주하지 않으므로 응답 본문을 처리하는 등 처리 방법을 결정할 수 있습니다. 그 라인을 따라

뭔가 작동합니다 : 당신은 예를 들어 certains 상태 코드에 대한 특별한 처리를하려는 경우

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("..."); 

이 흥미로운 접근 방식이다. 이 로직은 다른 라우트의 Camel 라우트 로직과 마찬가지로 direct 엔드 포인트를 사용하여 여러 경로에서 재사용 할 수 있습니다.

옵션 2 : 기본 오류 처리를 유지하려는 경우 onException

HttpOperationFailedException 액세스,하지만 당신은 어떤 이유로 예외 처리 코드에 응답 본체에 액세스하려면, 당신은 단지 필요 HttpOperationFailedExceptionresponseBody 속성에 액세스하십시오.

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' 속성이 있다는 것을 알았습니다. (분명히) 응답 본문 ... 나는 내 대답을 편집 할 것입니다. –