Apache Camel:无法获取异常主体
Apache Camel: Unable to get the Exception Body
只要我的 Camel Routes 中有正常流程,我就可以在下一个组件中获取正文。但是每当出现异常(Http 401 或 500)时,我都无法获取异常主体。我刚刚在服务器日志中收到 java 异常。
我也尝试过 onException() .. 使用该流程在错误时进入它,但我仍然没有得到 Web 服务发送的错误响应主体(我直接使用 POSTMAN 时得到),我只得到我已发送到网络服务的正文中的请求。
同时添加路线:
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();
选项 1:自行处理失败状态码
throwExceptionOnFailure=false endpoint option(至少可用于 camel-http
和 camel-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
端点在多个路由中重用该逻辑,就像任何其他 Camel 路由逻辑一样。
选项 2:在 onException
中访问 HttpOperationFailedException
如果你想保留默认的错误处理,但由于某些原因想访问异常处理代码中的响应体,你只需要访问responseBody
属性 HttpOperationFailedException
.
这是一个例子:
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();
}
});
只要我的 Camel Routes 中有正常流程,我就可以在下一个组件中获取正文。但是每当出现异常(Http 401 或 500)时,我都无法获取异常主体。我刚刚在服务器日志中收到 java 异常。 我也尝试过 onException() .. 使用该流程在错误时进入它,但我仍然没有得到 Web 服务发送的错误响应主体(我直接使用 POSTMAN 时得到),我只得到我已发送到网络服务的正文中的请求。
同时添加路线:
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();
选项 1:自行处理失败状态码
throwExceptionOnFailure=false endpoint option(至少可用于 camel-http
和 camel-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
端点在多个路由中重用该逻辑,就像任何其他 Camel 路由逻辑一样。
选项 2:在 onException
中访问HttpOperationFailedException
如果你想保留默认的错误处理,但由于某些原因想访问异常处理代码中的响应体,你只需要访问responseBody
属性 HttpOperationFailedException
.
这是一个例子:
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();
}
});