响应中的GetEntity与ReadEntity(Javax.ws.rs)

时间:2018-02-14 07:33:10

标签: java rest jax-rs

我正在编写一个客户端来使用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

有人可以帮我理解幕后真实情况吗?

2 个答案:

答案 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()解析。