2013-04-03 10 views
0

我试图使用InMemoryClientExecutor打电话给我本地JVM其返回javax.ws.rs.core.Response对象服务。我能得到这个工作,但仅通过指定字符串类型,像这样:JAX-RS(高枕无忧)InMemoryClientExecutor /的ClientRequest异常

String response = new ClientRequest("/myService", executor) 
    .get(String.class) 
    .getEntity(); 

由于服务的签名是像这样:

@GET 
@Path("/myService") 
public Response getSomeData(@Form MyFormBean bean) { 
    //...blah... 
} 

不过,我想获得的实际响应(Response)回来,这样我可以得到实体出来,在我的新的“聚合”响应返回的对象。当我刚刚返回字符串杰克逊分析器不认为这是JSON,只是一个普通的字符串,因此它确实像编码线闯入\ n等事情

每当我做这样的事情:

String response = new ClientRequest("/myService",executor) 
    .get(Response.class) 
    .getEntity(); 

,甚至这只是得到普通请求对象:

String response = new ClientRequest("/myService", executor).get().getEntity(); 

我得到以下异常:

Exception Occured: org.jboss.resteasy.client.ClientResponseFailure: Unable to find a MessageBodyReader of content-type application/json and type null 
    at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:523) 
    at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:514) 
    at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:415) 
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:377) 
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:338) 

还存在更进一步的是:

Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.LoggableFailure: Unable to find contextual data of type: javax.servlet.http.HttpServletRequest 
    at org.jboss.resteasy.core.ContextParameterInjector$GenericDelegatingProxy.invoke(ContextParameterInjector.java:56) 
    at $Proxy210.getScheme(Unknown Source) 

我在哪里出错了?

回答

0

有从服务器返回没​​有Response对象,只是一个数据流,在你的情况下,一些实体的代表,以JSON格式。试图将这些数据反序列化回客户端的Response对象将不起作用,因为实际上你所说的JSON代表的是一个Response对象,它没有(它代表的是*用于包含的实体响应)。

好消息是,还有其他方法可以获得实体,它不需要试图将其旋转回Response。你需要对你的客户端的类路径中的实体:

MyEntity response = new ClientRequest("/myService", executor) 
    .get(MyEntity.class) 
    .getEntity(); 

替换MyEntity与您期望接收的实际实体的类型。