Apache Camel:无法获取异常正文 [英] Apache Camel: Unable to get the Exception Body

查看:29
本文介绍了Apache Camel:无法获取异常正文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我的骆驼路线有正常的流量时,我就能够将身体放入下一个组件中。但是只要有异常(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:
Body:${body}")
        .to("{{AdsContractUpdateEndpoint}}")
        .log("after calling ADS for ContractUpdate:
Body:${body}")
        .convertBodyTo(String.class)
        .end();

推荐答案

选项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:访问onException中的HttpOperationFailedException

如果您希望保留默认错误处理,但由于某些原因想访问异常处理代码中的响应体,则只需访问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();
    }
});

这篇关于Apache Camel:无法获取异常正文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆