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

Cro*_*ool 5 java rest jax-rs

我正在编写一个客户端来使用RestService,我必须从响应中读取一个实体,我完全混淆了应该使用哪个方法(getEntityvs readEntity).

每当我收到WebApplicationException时,我都必须检索实体.

所以,我的代码或多或少看起来像.

catch(WebApplicationException ex) {
// Do something with ex.getResponse
}
Run Code Online (Sandbox Code Playgroud)

从我测试过的,

ex.getResponse().hasEntity() ---> true

ex.getResponse().getEntity() == null ---> true
Run Code Online (Sandbox Code Playgroud)

我不知道它是如何工作的,但如果第一个是真的,那么第二个陈述是如何成真的.

令人惊讶的是,readEntity对我来说很好,我能够从响应中读出实体.

但是,通过readEntity读取实体后,

这个电话给出了错误.

 ex.getResponse().getEntity() == null --> false
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解幕后真的发生了什么吗?

Pau*_*tha 12

Response班有两个用途:服务器端和客户端.在服务器端,它被称为出站响应.在客户端,它是入站响应.

出站

@GET
public Response get() {
    MyModel model = new MyModel();
    return Response.ok(model).build();
}
Run Code Online (Sandbox Code Playgroud)

入站

Response response = ClientBuilder.newClient().target(url).request().get();
Run Code Online (Sandbox Code Playgroud)

getEntity()方法旨在用于服务器端,因为您想获取实体对象.对我们来说没什么用处,但是泽西岛会用它来让实体对象在发送之前对它进行序列化.

readEntity()方法将在客户端使用,因为您正在尝试读取实体流.如果您尝试在服务器端调用此方法,则会收到错误消息,指出您无法读取出站响应中的流.

就你所经历的行为而言,我无法解释他们为何如此实施.


Cec*_*lya 7

API中记录了此行为:

public abstract <T> T readEntity(Class<T> entityType)

使用支持将消息实体流映射到请求的类型的MessageBodyReader,将消息实体输入流作为指定Java类型的实例读取。

[...]

从此方法返回的消息实例将被缓存,以通过getEntity()进行后续检索

的第一个调用ex.getResponse().getEntity()为null,因为尚未读取Entity。调用后readEntity(),解析后的实体将按返回getEntity()