Camel不会设置"传输编码分块",以防异常处理程序处理器准备响应



我正在使用运行在servicemix上的Apache-CXF实现REST服务,为此我有一个驼峰路由,它执行一些处理,通过队列发送消息,处理更多的消息并发回回复。像这样:

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请求,并在所有这些请求中显示正确的响应体。现在我想保留请求头,所以我在代码中做了一点改变,以便仅在exchange.getIn()中设置响应体。例如:在验证失败的情况下,我执行:

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

通过这个小小的更改,我用来发出请求的其他客户机停止显示响应体。根据服务器日志,响应正在生成,并且根据rest客户端的日志,我得到了适当的响应,但是它们无法显示响应体,只有在我停止之间的路由时。正常响应显示正常。只有restclient-UI足够周到地显示了为什么他们不显示正文的错误,错误是:

Byte array conversion from response body stream failed.

进一步挖掘,我发现唯一的响应头在成功响应中存在,但在错误响应中缺失:

Transfer-Encoding   chunked

错误响应大约1000个字符长,包含一个名为content-length的标题。我不确定,但我认为这个问题与这个本身有关。我真的很想玩交换。但是骆驼准备的这些不同的反应让我很困惑。我如何确保我的骆驼响应总是正确显示?

Content-Length报头将从原始请求中保留下来,因此您需要删除它,以便camel cxf可以计算出响应的新主体长度,并以此设置Content-Length

最新更新