我正在编写一个使用RestService的客户端,我必须从响应中读取一个实体,我完全不明白应该使用这两种方法中的哪一种(getEntity和readEntity)。
每当我得到一个WebApplicationException时,我就必须检索实体。
所以,我的代码或多或少看起来像这样。
catch(WebApplicationException ex) {
// Do something with ex.getResponse
}不管我测试过什么,
ex.getResponse().hasEntity() ---> true
ex.getResponse().getEntity() == null ---> true我不知道它是如何工作的,但如果第一个是真的,那么第二个陈述怎么可能是真的。
令人惊讶的是,readEntity对我来说工作得很好,我能够从响应中读出实体。
但是,在通过readEntity读取实体之后,
这个调用给出了false。
ex.getResponse().getEntity() == null --> false有人能帮我了解一下幕后到底发生了什么吗?
发布于 2018-02-14 18:03:38
此行为记录在API中
public abstract <T> T readEntity(Class<T> entityType)
使用支持将消息实体流映射到所请求的类型的MessageBodyReader,将消息实体输入流作为指定Java类型的实例读取。
..。
从该方法返回的消息实例将被缓存,以便随后通过getEntity()进行检索。
对ex.getResponse().getEntity()的第一个调用是null,因为实体还没有被读取。调用readEntity()后,解析后的实体将以getEntity()解析的形式返回。
发布于 2018-02-14 16:30:42
Response类有两种用途:服务器端和客户端。在服务器端,它被称为出站响应。在客户端,它是入站响应。
出站
@GET
public Response get() {
MyModel model = new MyModel();
return Response.ok(model).build();
}入站
Response response = ClientBuilder.newClient().target(url).request().get();getEntity()方法将在服务器端使用,因为您希望获取实体对象。它对我们来说用处不大,但Jersey将使用它让entity对象在将其发送出去之前序列化它。
readEntity()方法将在客户端使用,因为您正在尝试读取实体流。如果你试图在服务器端调用它,你会得到一个错误,告诉你不能在出站响应中读取流。
至于你正在经历的行为,我真的不能解释为什么他们实现了这样的方式。
https://stackoverflow.com/questions/48781860
复制相似问题