【问题标题】:Response to REST client from Camel CXFRS route?从 Camel CXFRS 路由响应 REST 客户端?
【发布时间】:2014-09-18 23:01:57
【问题描述】:

我正在尝试在 CXFRS Camel 路由中创建对 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>

返回正文,但忽略响应代码​​和内容类型。我做错了什么?

谢谢, 马特

【问题讨论】:

  • 你用的是哪个版本的骆驼?
  • 我在 Spring 3.2.8-RELEASE 中使用 Camel 2.13.1 和 CXF 2.7.11
  • 我刚刚更新到 Camel 2.14.0 和 CXF 3.0.1,但这并不能解决我的问题。

标签: apache-camel


【解决方案1】:

基本上,camel-cxfrs 在将交换转换为实际的 HTTP 响应时会覆盖交换中设置的任何标头 见here

exchange.getOut().setHeaders(binding.bindResponseHeadersToCamelHeaders(response, exchange));

发生这种情况是因为DefaultCxfRsBinding 需要一个 jaxrs 响应作为参数。

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

    <cxf:rsServer id="MyService" address="/myAddress">      
    <cxf:binding><bean class="MyCustomCxfRsBinding" /></cxf:binding>                
    <cxf:serviceBeans>
        <ref bean="myResourceWithJSR311Annotations" />
    </cxf:serviceBeans>
    </cxf:rsServer>

或者让你的骆驼路线返回一个 带有标头的 jaxrs 响应,而不是在 rout 或骆驼处理器中设置标头。东西

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>

您还可以使用返回带有标头的 jaxrs.Response 的 Service bean

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

【讨论】:

  • 这是很好的反馈,非常感谢。我最终创建了一个自定义处理器,类似于您的解决方案,它让我能够继续前进。然而,这感觉像是一个 hack,所以我稍微改变了轨道,将 REST DSL (Camel 2.14) 与 Servlet 组件一起使用,这对我来说感觉更灵活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多