【问题标题】:In a CXF based Camel route, unable to return the response body from a remote service after post-processing在基于 CXF 的 Camel 路由中,后处理后无法从远程服务返回响应正文
【发布时间】:2020-07-02 13:15:51
【问题描述】:

我要做的是创建一个概念验证 Camel 路由,它公开一个 cxfrs 服务端点。使用 cxf 客户端将对此端点的请求路由到不同服务器上的另一个服务。在我得到 xml 响应之后,我需要用它做一些事情,比如说将响应正文保存到数据库中。当然,原始请求者也需要收到响应。

如果我不对响应进行任何后处理,那么我会按预期在浏览器中获取响应 xml。但是每当我尝试在我的路由中添加另一个步骤来处理响应时,浏览器都会得到一个空的响应。正如您在注释掉的行中看到的那样,我使用哪个骆驼组件调用 bean 并不重要。我尝试了 bean、process 和 to。即使我将 bean 中的所有代码都注释掉,所以它什么也不做,结果是一样的。

这是我的路线:

        <cxf:rsServer address="{{base.url}}/employeeservicecxf" id="restServiceCxf">
        <cxf:serviceBeans>
            <bean class="com.kf.camel.sample.EmployeeServiceResource"/>
        </cxf:serviceBeans>
    </cxf:rsServer>
    <cxf:rsClient
        address="http://{{remote.server}}/adminrest/jaxrs/projects/10475/products"
        id="rsClient" loggingFeatureEnabled="true" />
    <bean class="com.kf.camel.sample.CamelProcessor" id="processor"/>
    <bean class="com.kf.camel.sample.CamelResponseProcessor" id="responseProcessor"/>
    <camelContext id="_camelContext1" trace="true" xmlns="http://camel.apache.org/schema/spring">
        <propertyPlaceholder id="properties" location="app.properties"/>
        <route id="_route1">
            <from id="_from1" uri="cxfrs://bean://restServiceCxf"/>
            <process id="_process1" ref="processor"/>
            <setHeader headerName="CamelHttpMethod" id="_setHeader1">
                <constant>GET</constant>
            </setHeader>
            <to id="_to1" uri="cxfrs://bean://rsClient"/>
            <!-- to id="_to3" uri="bean://com.kf.camel.sample.CamelResponseProcessor?method=process"/-->
            <bean id="_bean1" ref="responseProcessor" method="process"/>
            <!-- process id="_process2" ref="responseProcessor"/-->

        </route>
</camelContext>
</beans>

Response Headers Response Body with content length mismatch error

【问题讨论】:

    标签: java apache-camel spring-camel cxfrs


    【解决方案1】:

    你试过enable stream caching吗?

    听起来您对响应执行的任何第一个操作都在消耗流,并且任何进一步尝试再次读取流都会得到空结果。

    当您想在 Camel 中多次读取流时,您必须启用流缓存。

    【讨论】:

    • 谢谢!我启用了流缓存,现在我将响应正文返回给浏览器。然而,我仍然面临的一个问题是我丢失了“Content-Type”标头(应用程序/xml)并且它以文本/html 的形式返回。我试过像这样在 Bean 中显式设置标题:exchange.getOut().setHeader("Content-Type", "application/xml");而且,我尝试使用自定义 HeaderFilterStrategy 实现,它为“Content-Type”标头返回 true。我还在 URI 上尝试了 rsClient 调用的“propagateContexts=true”选项。
    • 我通过将以下注释添加到传入请求的 REST 资源类中解决了上面的 Content-Type 问题:@Produces(MediaType.APPLICATION_XML)
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2015-11-20
    • 2018-09-21
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多