首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自Camel CXFRS路线的REST客户响应?

来自Camel CXFRS路线的REST客户响应?
EN

Stack Overflow用户
提问于 2014-09-18 23:01:57
回答 1查看 3.1K关注 0票数 2

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

代码语言:javascript
复制
<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>

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

谢谢,马特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-24 15:43:02

基本上,camel-cxfrs在将交换转换为实际的HTTP响应时覆盖设置的任何头(请参阅这里 )。

代码语言:javascript
复制
exchange.getOut().setHeaders(binding.bindResponseHeadersToCamelHeaders(response, exchange));

这是因为DefaultCxfRsBinding期望jaxrs响应作为参数。

因此,要解决这个问题,您可以使用自定义DefaultCxfRsBinding重写exchange.getIn,以便从exchange.getIn()复制标头。

代码语言:javascript
复制
    <cxf:rsServer id="MyService" address="/myAddress">      
    <cxf:binding><bean class="MyCustomCxfRsBinding" /></cxf:binding>                
    <cxf:serviceBeans>
        <ref bean="myResourceWithJSR311Annotations" />
    </cxf:serviceBeans>
    </cxf:rsServer>

或者让您的骆驼路由返回一个jaxrs响应,其标题为,而不是在rout或camel处理器中设置头部。某物

代码语言:javascript
复制
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;
    }
}

对于你的样本:

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

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

代码语言:javascript
复制
<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <bean ref="myServiceImpl">
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25923811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档