基本上,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">