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 = EmployeeVerificationResponseAccept.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