Camel 不会设置 'Transfer-Encoding chunked' 以防异常处理程序准备好响应

Camel does not set 'Transfer-Encoding chunked' in case response is prepared by exception handler processor

我正在 servicemix 上使用 Apache-CXF 运行 实现 REST 服务,为此我有一个骆驼路线,可以进行一些处理,通过 queue 发送消息,处理更多和发回回复。像这样:

from("direct:start")
    .process(A)
    .process("activemq:abc")
    .process(B);

在这条路线上,我应用了一些基本的验证和异常处理程序,当我在这两种情况下都必须停止路线时,我使用这样的东西:

exchange.getOut().setBody(response);
exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);

我使用 soap UI、restclient-UI 和 putty 发出 http 请求,并且我在所有这些请求中都显示了正确的响应 body。现在我想保留请求 headers,所以我在代码的每个地方都做了一点改动,以便仅在 exchange.getIn() 中设置响应主体。例如:如果验证失败,我会这样做:

exchange.getIn().setBody(response);
exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);

仅通过这个小改动,我用来发出请求的其余客户端 停止显示响应 body。根据服务器日志,正在生成响应,并且根据 rest 客户端中的日志,我得到了正确的响应,但是 他们无法显示响应 body 只有在我停止的情况下 之间的路线。正常响应显示就好了。只有 restclient-UI 足够体贴地显示了为什么他们不显示 body 的错误,错误是:

Byte array conversion from response body stream failed.

深入挖掘,我发现了唯一的响应 header,它在成功响应中存在,但在错误响应中丢失:

Transfer-Encoding   chunked

错误响应大约有 1000 个字符长,包含一个名为 content-length 的 header。我不确定,但我认为问题与此本身有关。我真的很想玩 exchange.getIn 但骆驼准备的这些不同类型的回应让我感到困惑。如何确保我的骆驼反应始终正确显示?

Content-Length header 将从原始请求中保留下来,因此您需要将其删除,以便 camel cxf 可以在响应中计算出新的 body 长度并设置 Content-Length 那个。