Hi I don't think you can do a direct conversion to string I think u need to read it as a buffered input stream and convert to string. Can you try it that way
Regards Aravind > On Oct 25, 2016, at 4:41 PM, Steve Huston <shus...@riverace.com> wrote: > > 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 >>>> >>>> >>>