首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetEntity vs ReadEntity in Response (Javax.ws.rs)

GetEntity vs ReadEntity in Response (Javax.ws.rs)
EN

Stack Overflow用户
提问于 2018-02-14 15:33:10
回答 2查看 15.6K关注 0票数 10

我正在编写一个使用RestService的客户端,我必须从响应中读取一个实体,我完全不明白应该使用这两种方法中的哪一种(getEntityreadEntity)。

每当我得到一个WebApplicationException时,我就必须检索实体。

所以,我的代码或多或少看起来像这样。

代码语言:javascript
复制
catch(WebApplicationException ex) {
// Do something with ex.getResponse
}

不管我测试过什么,

代码语言:javascript
复制
ex.getResponse().hasEntity() ---> true

ex.getResponse().getEntity() == null ---> true

我不知道它是如何工作的,但如果第一个是真的,那么第二个陈述怎么可能是真的。

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

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

这个调用给出了false。

代码语言:javascript
复制
 ex.getResponse().getEntity() == null --> false

有人能帮我了解一下幕后到底发生了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-14 18:03:38

此行为记录在API

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

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

..。

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

ex.getResponse().getEntity()的第一个调用是null,因为实体还没有被读取。调用readEntity()后,解析后的实体将以getEntity()解析的形式返回。

票数 9
EN

Stack Overflow用户

发布于 2018-02-14 16:30:42

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

出站

代码语言:javascript
复制
@GET
public Response get() {
    MyModel model = new MyModel();
    return Response.ok(model).build();
}

入站

代码语言:javascript
复制
Response response = ClientBuilder.newClient().target(url).request().get();

getEntity()方法将在服务器端使用,因为您希望获取实体对象。它对我们来说用处不大,但Jersey将使用它让entity对象在将其发送出去之前序列化它。

readEntity()方法将在客户端使用,因为您正在尝试读取实体流。如果你试图在服务器端调用它,你会得到一个错误,告诉你不能在出站响应中读取流。

至于你正在经历的行为,我真的不能解释为什么他们实现了这样的方式。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48781860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档