我正在尝试使用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)
我哪里错了?
答案 0 :(得分:0)
没有从服务器返回Response
个对象,只是一个数据流,在您的情况下,是JSON格式的某个实体的表示形式。尝试将这些数据反序列化回客户端的Response对象是行不通的,因为实际上你说JSON代表一个Response
对象,它没有(它代表 *使用的实体)在响应中包含。
好消息是,还有其他方法可以获取实体,而不需要尝试将其反转为Response
。您需要在客户端的类路径中包含实体:
MyEntity response = new ClientRequest("/myService", executor)
.get(MyEntity.class)
.getEntity();
将MyEntity
替换为您希望收到的实际实体的类型。