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 > > > > > > > >