我正在编写一个客户端来使用RestService,我必须从响应中读取一个实体,我完全混淆应该使用哪两种方法(getEntity
vs readEntity
)
每当我收到WebApplicationException时,我都必须检索实体。
所以,我的代码或多或少看起来像。
catch(WebApplicationException ex) {
// Do something with ex.getResponse
}
来自,无论我测试过什么,
ex.getResponse().hasEntity() ---> true
ex.getResponse().getEntity() == null ---> true
我不知道它是如何工作的,但如果第一个是真的那么第二个陈述是真的。
令人惊讶的是,readEntity对我来说很好,我能够阅读 实体退出回应。
但是,通过readEntity读取实体后,
此调用给出了错误。
ex.getResponse().getEntity() == null --> false
有人可以帮我理解幕后真实情况吗?
答案 0 :(得分:8)
Response
类有两种用途:服务器端和客户端。在服务器端,它被称为出站响应。在客户端上,它是入站响应。
<强>外向强>
@GET
public Response get() {
MyModel model = new MyModel();
return Response.ok(model).build();
}
<强>入站强>
Response response = ClientBuilder.newClient().target(url).request().get();
getEntity()
方法旨在用于服务器端,因为您希望获取实体对象。对我们来说没什么用处,但是泽西岛会用它来让实体对象在发送之前对它进行序列化。
readEntity()
方法将在客户端使用,因为您正在尝试读取实体流。如果您尝试在服务器端调用此方法,则会收到错误消息,指出您无法读取出站响应中的流。
就你所经历的行为而言,我无法解释他们为何如此实施。
答案 1 :(得分:3)
此行为记录在API:
中
public abstract <T> T readEntity(Class<T> entityType)
使用MessageBodyReader将消息实体输入流作为指定Java类型的实例读取,该MessageBodyReader支持将消息实体流映射到请求的类型。
[...]
此方法返回的消息实例将被缓存,以便通过getEntity()进行后续检索。
对ex.getResponse().getEntity()
的第一次调用为空,因为尚未读取实体。调用readEntity()
后,解析后的实体将由getEntity()
解析。