2014-09-18 96 views
2

我试图在CXFRS骆驼路由中创建对REST Web服务调用的响应,但不管我对客户端的响应总是相同的200,而不是201.下面是我的路由:骆驼CXFRS路由对REST客户端的响应?

<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> 

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

谢谢, 马特

+0

一个jaxrs.Response? – 2014-09-21 03:53:23

+0

我使用驼峰2.13.1和CXF 2.7.11与春季3.2.8-RELEASE – Matt 2014-09-21 06:02:30

+0

我只是更新到骆驼2.14.0和CXF 3.0.1,但这不能解决我的问题。 – Matt 2014-09-21 07:31:14

回答

3

基本上骆驼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响应。东西

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> 

你也可以使用一个服务豆返回与headders

<route id="front-end"> 
    <from uri="cxfrs:bean:myService" /> 
    <bean ref="myServiceImpl"> 
是否使用的是骆驼的版本
+0

这是非常好的反馈,非常感谢。我最终创建了一个定制处理器,类似于您的解决方案,并且允许我前进。但是,它感觉像是一个黑客,所以我切换轨道一点点使用REST DSL(驼峰2.14)与Servlet组件,这对我来说更加灵活。 – Matt 2014-09-26 23:08:20