Thank you for replying, Aravind!

Also interesting - I had a LoggingFeature added to the JAXRSClientFactoryBean 
with which I set up the web service. I removed that (and removed the stream 
cache enabling to get back to starting point). With that, I can get a Response 
into my handler after invoking the service, but trying to read the response 
entity as:

String body = wsResponse.readEntity(String.class);

I get an exception:
javax.ws.rs.client.ResponseProcessingException: Problem with reading the data, 
class java.lang.String, ContentType: application/json;charset=UTF-8.
        at 
org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:439)
        at 
org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:379)
        at 
org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:320)
        at 
org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:310)
... in my code
Caused by: java.io.IOException: stream is closed
        at 
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.ensureOpen(HttpURLConnection.java:3308)
        at 
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3333)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.Reader.read(Reader.java:140)
        at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:316)
        at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:304)
        at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:288)
        at 
org.apache.cxf.jaxrs.provider.StringTextProvider.readFrom(StringTextProvider.java:45)
        at 
org.apache.cxf.jaxrs.provider.StringTextProvider.readFrom(StringTextProvider.java:36)
        at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1366)
        at 
org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:370)
        ... 23 more

> -----Original Message-----
> From: aravind r [mailto:aravindrajasekha...@gmail.com]
> Sent: Tuesday, October 25, 2016 1:39 PM
> To: users@camel.apache.org
> Subject: Re: Trouble accessing Response body content from RESTful call
> 
> Hi Steve,
> 
> Are u logging the Message body somewhere before consuming (say Camel
> logger in between),that could also lead to input stream consumption.
> 
> Regards,
> Aravind
> 
> On Tue, Oct 25, 2016 at 1:15 PM, Doug Douglass <douglass.d...@gmail.com>
> wrote:
> 
> > I can't say where the response body is being consumed, but try
> > enabling stream caching[1] and see what you get.
> >
> > Doug
> >
> > [1] http://camel.apache.org/stream-caching.html
> >
> > On Tue, Oct 25, 2016 at 9:31 AM, Steve Huston <shus...@riverace.com>
> > wrote:
> >
> > > I am developing a route that calls a web service; said web service
> > returns
> > > a JSON string (Not always the same type represented). I have this in
> > > a route as:
> > >
> > >        from(myqueue)
> > >         .bean(SetupCxfRequest.class)       // This sets up parameters for
> > > REST API call
> > >         .convertBodyTo(org.apache.cxf.message.MessageContentsList.class)
> > >         .to("cxfrs:bean:ws?throwExceptionOnFailure=false")
> > >         .bean(WebServiceResponse.class)
> > >
> > > SetupCxfRequest will:
> > >       exchange.setPattern(ExchangePattern.InOut);
> > >       // Indicate using Proxy API.
> > >       in.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API,
> > > Boolean.FALSE);
> > >       in.setHeader(CxfConstants.OPERATION_NAME,
> > > VerifyEmployeeRequest);
> > >
> > > The web service interface method for the call in question is:
> > >     @GET
> > >     @Path(value="/authentication/{company}/employees/{id}")
> > >     @Produces({ MediaType.APPLICATION_JSON })
> > >     public Response VerifyEmployeeRequest(@PathParam("company")
> > > String scac,
> > >                                           @PathParam("id") String id,
> > >                                           @QueryParam("pin") String pin,
> > >                                           @QueryParam("reason")
> > > String reason);
> > >
> > > The case I'm working now is that the web service is called and it
> > > returns a 404 status with a body of JSON-marshaled stuff I need to get at.
> > > From my route above, WebServiceResponse is then called as:
> > >
> > > public class WebServiceResponse {
> > >
> > >         @Handler
> > >         public Object convertWebServiceResponse(Response wsResponse,
> > > Exchange exchange) throws IOException { ObjectMapper unmarshaller =
> > > new ObjectMapper();
> > >                 Class<?> target = null;
> > >                 Message in = exchange.getIn();
> > >                 int opStatus = wsResponse.getStatus();
> > >                 if (opStatus == 200)
> > >                         target = EmployeeVerificationResponseAc
> > cept.class;
> > >                 else
> > >                         target =
> > > EmployeeVerificationResponseDeny.class;
> > >
> > > So far, so good - opStatus is 404. I need to get the string which is
> > > the response body and then unmarshall it.
> > > wsResponse.entity is a SequenceInputStream and one of the input
> > > streams appears to be the string I'm expecting from the web service;
> > > however, it has been completely consumed (length and position are
> > > the same). Where
> > did
> > > it go, and how can I get it?
> > >
> > > Thanks,
> > > -Steve
> > >
> > >
> >

Reply via email to