Apache camel 从Camel CXFRS路由响应REST客户端?

Apache camel 从Camel CXFRS路由响应REST客户端?,apache-camel,Apache Camel,我试图在CXFRS驼峰路由中创建对REST web服务调用的响应,但无论我做什么,对客户端的响应总是相同的200,而不是201。这是我的路线: <route id="front-end"> <from uri="cxfrs:bean:myService" /> <setBody> <constant>Will do...</constant> </setBody> <se

我试图在CXFRS驼峰路由中创建对REST web服务调用的响应,但无论我做什么,对客户端的响应总是相同的200,而不是201。这是我的路线:

<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <setBody>
        <constant>Will do...</constant>
    </setBody>
    <setHeader headerName="CamelHttpResponseCode">
        <constant>201</constant>
    </setHeader>
    <setHeader headerName="Content-Type">
        <constant>more/blah</constant>
    </setHeader>
</route>

可以。。。
201
更多/废话
返回正文,但忽略响应代码和内容类型。我做错了什么

谢谢,
Matt

当cxfrs将exchange转换为实际HTTP响应时,它会覆盖exchange中设置的任何头 见:

这是因为需要一个jaxrs响应作为参数

因此,要解决此问题,您可以使用自定义文件覆盖DefaultCxfRsBinding,以便从exchange.getIn()复制头文件

对于您的样本:

<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <setBody>
        set it to Response.ok(your message).header(x, y).build()
    </setBody>

将其设置为Response.ok(您的消息).header(x,y).build()
您还可以使用服务bean返回带有标题的jaxrs.Response

<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <bean ref="myServiceImpl">


您使用的是哪一版本的camel?我在Spring 3.2.8-Release中使用camel 2.13.1和CXF 2.7.11。我刚刚更新到camel 2.14.0和CXF 3.0.1,但这并不能解决我的问题。这是非常好的反馈,非常感谢。我最终创建了一个定制处理器,类似于您的解决方案,它允许我继续前进。然而,这感觉像是一种黑客行为,所以我稍微改变了跟踪方式,使用RESTDSL(Camel 2.14)和Servlet组件,这对我来说更灵活。
class HttpHeaderProcessor implements Processor
{
    @Override
    public void process(Exchange exchange) throws Exception
    {
        Message message = exchange.getIn();
        Response response = convertToJaxRs(message);
        exchange.getIn().setBody(response);
        exchange.getIn().setHeader("Test", "Won't work unless DefaultCxfRsBinding is not replaced with a custom one");

    }

    private Response convertToJaxRs(Message message)
    {
        ResponseBuilder jaxrsResponseBuilder = Response.ok(message.getBody(), MediaType.APPLICATION_XML);
        jaxrsResponseBuilder.header("header1", "you'll see this");
        Response response = jaxrsResponseBuilder.build();
        return response;
    }
}
<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <setBody>
        set it to Response.ok(your message).header(x, y).build()
    </setBody>
<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <bean ref="myServiceImpl">