I spoke too soon. I have been trying to figure out why the CXF service's
JAXB unmarshalling has been throwing EOF in prolog errors. I created a
processor to get some idea as to what the messages are looking like before
getting sent off to CXF. My routes are configured as such:

    <route>
      <from uri="jetty:http://0.0.0.0:8099/api/rest?matchOnUriPrefix=true";
/>
      <process ref="myBeanName" />
      <to uri="direct:api" />
      <to uri="ref:message-logger" />
    </route>

streamCache is set to true. The processor has the following code:

        HttpServletRequest request =
exchange.getIn(HttpMessage.class).getRequest();
        String something = IOUtils.toString(request.getInputStream());
        String requestBody =
IOUtils.toString(exchange.getIn().getBody(InputStream.class));

The request's inputStream, something, is "". The requestBody, however,
contains the entire XML structure that I am posting. I believe that the
problem is that Camel reads the incoming Http request's input stream and
copies the data to the Camel message body, but leaves the request's input
stream as read and therefore un-rereadable. Correct me if I'm wrong, but it
is this request, I believe, that gets routed to the CXF service. Then CXF
has nothing to read and the unmarshalling fails.

Am I right? Is this a bug?



On Mon, Jun 3, 2013 at 4:13 PM, Todd Orr <[email protected]> wrote:

> That works perfectly. Thanks!
>
>
> On Mon, Jun 3, 2013 at 4:09 PM, Sergey Beryozkin <[email protected]>wrote:
>
>> Hi
>>
>> On 03/06/13 20:53, Todd Orr wrote:
>>
>>> I'm relatively new to Camel. I did research what I am attempting to do,
>>> but
>>> did not find much help.
>>>
>>> The goal is to take an existing standalone CXF rest service (with many
>>> service beans) and split it into multiple independent CXF rest services
>>> coordinated by Camel.
>>>
>>> As an initial step, I am attempting to front the existing service with
>>> Camel. So to be clear, at this stage, I only want to pass HTTP requests
>>> from Camel down to the CXF service. To this end I have run into multiple
>>> issues. I am currently unable to route the HTTP message received by Camel
>>> to the CXF service.
>>>
>>> My route:
>>>
>>>
>>>      <route>
>>>        <from
>>> uri="servlet:///rest?**servletName=CamelAPI&amp;**matchOnUriPrefix=true"
>>> />
>>>        <to uri="ref:message-logger" />
>>>        <setBody><simple>**CamelHttpServletRequest</**simple></setBody>
>>>        <to uri="ref:message-logger" />
>>>        <to uri="direct:api" />
>>>      </route>
>>>
>>> I have configured CXF using camel's transport factory using:
>>>
>>>    <bean
>>> class="org.apache.camel.**component.cxf.transport.**
>>> CamelTransportFactory">
>>>      <property name="bus" ref="cxf" />
>>>      <property name="camelContext" ref="camelContext" />
>>>      <property name="checkException" value="true" />
>>>      <property name="transportIds">
>>>        <list>
>>>          
>>> <value>http://cxf.apache.org/**transports/camel<http://cxf.apache.org/transports/camel>
>>> </value>
>>>        </list>
>>>      </property>
>>>    </bean>
>>>
>>> This was required to get around some earlier issues I ran into. My CXF
>>> service is configured like:
>>>
>>>
>>>    <jaxrs:server id="restService" address="direct:api">
>>>      <jaxrs:serviceBeans>
>>>    ...
>>>
>>> Startup is fine. On attempting to hit the servlet via RESTClient I can
>>> see
>>> the message I passed in logged correctly. However, the CXF service cannot
>>> receive the message. The error is:
>>>
>>> No consumers available on endpoint: Endpoint[direct://api] to process:
>>> Exchange ...
>>>
>>> Any help is greatly appreciated.
>>>
>>>  This is an interesting idea, to try to use a 'direct' URI scheme as
>> jaxrs server endpoint. I don't think it works right now, and I'm not sure
>> what has to be done yet, but definitely worth investigating...
>> In meantime, using Camel transport scheme will do, try something like
>> this:
>>
>> <jaxrs:server id="hello_rest" address="camel://direct:**
>> HelloWorldRestServerEndpoint">
>> <!-- usual declarations here -->
>> </jaxrs:server>
>>
>>     <!-- Camel routes from addresses on the servlet to rest and jaxws
>> servers -->
>>     <camelContext id="camelContext" xmlns="http://camel.apache.**
>> org/schema/spring <http://camel.apache.org/schema/spring>" trace="false">
>>         <route>
>>             <from uri="servlet:///HelloWorld?**matchOnUriPrefix=true"/>
>>             <to uri="direct:**HelloWorldRestServerEndpoint"/**>
>>         </route>
>>     </camelContext>
>>
>>
>> HTH, Sergey
>>
>>> T
>>>
>>>
>>
>

Reply via email to