javaapache-camelspring-camelcxfrs

In a CXF based Camel route, unable to return the response body from a remote service after post-processing


What i'm trying to do is create a proof-of-concept Camel route, that exposes a cxfrs service endpoint. Requests to this endpoint are routed to another service on a different server using cxf client. After i get the xml response, i need to do some stuff with it, lets say save the response body to a DB for example. And of course the original requestor needs to receive the response as well.

If i don't do any post-processing of the response, then i get the response xml in the browser as expected. But any time i try to add another step to my route for processing the response, the browser gets a response that is empty. As you can see in the commented out lines, it doesn't matter which camel component i use the call the bean. I tried bean, process, and to. Even if i comment out all the code from the bean so it does nothing, the result is the same.

Here's my route:

        <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


Solution

  • Have you tried to enable stream caching?

    Sounds like any first operation you do on the response is consuming the stream and any further attempt to read the stream again gets an empty result.

    When you want to read a stream multiple times in Camel you have to enable stream caching.