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

Reply via email to