我试图在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>返回主体,但忽略响应代码和内容类型。我做错了什么?
谢谢,马特
发布于 2014-09-24 15:43:02
基本上,camel-cxfrs在将交换转换为实际的HTTP响应时覆盖设置的任何头(请参阅这里 )。
exchange.getOut().setHeaders(binding.bindResponseHeadersToCamelHeaders(response, exchange));这是因为DefaultCxfRsBinding期望jaxrs响应作为参数。
因此,要解决这个问题,您可以使用自定义DefaultCxfRsBinding重写exchange.getIn,以便从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或camel处理器中设置头部。某物
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>您还可以使用Service返回带头的jaxrs.Response
<route id="front-end">
<from uri="cxfrs:bean:myService" />
<bean ref="myServiceImpl">https://stackoverflow.com/questions/25923811
复制相似问题