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:[email protected]]
> Sent: Tuesday, October 25, 2016 1:39 PM
> To: [email protected]
> 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 <[email protected]>
> 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 <[email protected]>
> > 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
> > >
> > >
> >