JAX-RS(REST Easy)InMemoryClientExecutor / ClientRequest异常

时间:2013-04-03 17:00:08

标签: java web-services exception jax-rs resteasy

我正在尝试使用InMemoryClientExecutor来调用本地JVM上的服务,这些服务返回javax.ws.rs.core.Response对象。我可以让它工作,但只能通过指定String类型,如下所示:

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

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

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

但是我希望得到实际的Response对象,以便我可以将实体取出并在新的“聚合”响应中返回这些对象。当我只返回字符串时,Jackson Parser不会将其视为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)

我哪里错了?

1 个答案:

答案 0 :(得分:0)

没有从服务器返回Response个对象,只是一个数据流,在您的情况下,是JSON格式的某个实体的表示形式。尝试将这些数据反序列化回客户端的Response对象是行不通的,因为实际上你说JSON代表一个Response对象,它没有(它代表 *使用的实体)在响应中包含

好消息是,还有其他方法可以获取实体,而不需要尝试将其反转为Response。您需要在客户端的类路径中包含实体:

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

MyEntity替换为您希望收到的实际实体的类型。