当前位置: 首页 > 知识库问答 >
问题:

Camel CXFRS路由对REST客户端的响应?

乐正翰
2023-03-14

我试图在CXFRS骆驼路由中创建对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>

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

谢谢,马特

共有1个答案

袁炳
2023-03-14

基本上,camel-cxfrs将exchange转换为实际的HTTP响应时会覆盖exchange中设置的任何头(请参阅此处):

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>
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>
<route id="front-end">
    <from uri="cxfrs:bean:myService" />
    <bean ref="myServiceImpl">
 类似资料:
  • 问题内容: 我一直在思考,我对客户端和服务器之间的路由感到困惑。假设我在将请求发送回Web浏览器之前使用ReactJS进行服务器端渲染,并使用react- router作为客户端路由在页面之间切换而不刷新为SPA。 我想到的是: 路线如何解释?例如,从首页()到帖子页面()的请求 路由在服务器端还是客户端去哪里? 它如何知道如何处理? 问题答案: 注意,此答案涵盖了React Router版本0.

  • 我想到的是: 路线是如何解释的?例如,从主页()到帖子页()的请求 路由在服务器端还是客户端? 它如何知道它是如何处理的?

  • 我注意到Rest客户端上有两个指南:MicroProfile和Vertx。既然微文件支持异步,那么使用基于Vertx的Rest客户端有什么好处?

  • 我正在尝试创建RESTful web服务,但无法使删除生效,我不确定问题在哪里。我认为问题在客户端项目中,但也可能在服务器项目的资源类中。 我有一个使用这种方法的学生道课,我不认为这是一个问题,因为它适用于其他项目。 我有一个StudentResource类,它是我从包含这段代码的模式中创建的RESTful资源 然后,我创建了一个java项目,并使用此方法创建了名为OneStudent的RESTf

  • 使用Elasticsearch原生Java客户端API()的应用程序升级到使用Java高级REST客户端的路径是什么? 文件(初步?)似乎表明: Java高级REST客户端依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。 (来源:https://www.elastic.co/guide/en/elasticsearch/clie

  • 我正在从事RESTWeb服务项目,目前实际上在mozilla的rest客户端中(chrome://restclient/content/restclient.html)它将获取{“id”:“1234”}作为请求json,获取id的详细信息,并从数据库中提供id的所有详细信息,然后转换为json数组,最后将其存储在responsetoservice对象中。 当我点击服务url时,请求到达服务器,状态