在JAX-RS中直接获取http body时如何关闭Response对象?

时间:2014-01-14 20:30:57

标签: java jersey jax-rs jersey-client

当我们使用泽西编写REST客户端时,我们应该关闭Response,如下所示:

Client c = ClientBuilder.newClient();

Response r = null;
try {
    r = c.target("http://localhost:8080/testrest/customers/854878").request().get();
    Customer cus = r.readEntity(Customer.class);

    /* process result */
} catch (Exception e) {
    /* log here */
    if (r != null) {
        r.close();
    }
}

当我们直接读取HTTP正文时,我们应该如何访问Response对象:

Client c = ClientBuilder.newClient();
Customer cus = c.target("http://localhost:8080/testrest/customers/854878").request().get(Customer.class);
/* close Response object and process result */

2 个答案:

答案 0 :(得分:2)

假设您使用的是Glassfish的jersey-client实施版本2.3.1(or check the other versions too),您可以按照get(Class)进行的调用。在你will find a call to

之前
org.glassfish.jersey.message.internal.InboundMessageContext#readEntity(Class<T>, Type, Annotation[], PropertiesDelegate)

根据一些规则,关闭响应

if (!buffered && !(t instanceof Closeable) && !(t instanceof Source)) {
    entityContent.close(); // wrapper to the actual response stream
}

其中t是基于指定的Class对象创建的对象。

API本身似乎没有说明这一点,因此实现不必关闭底层响应流。我唯一能找到的是来自Client javadoc的陈述

  

客户端实例必须在处理之前正确关闭   避免资源泄漏。

因此,不要依赖于特定的实现,请确保自己关闭所有内容,即使这意味着您必须中断Fluent方法调用并将中间对象引用存储在变量中。

答案 1 :(得分:0)

客户端有一个密切的方法。看看它的来源。如果Client.close没有清理其资源,那么您必须获取对Response的引用并将其关闭。否则你将挂起连接。 如果代码允许你做某事,那并不意味着你应该做。但是从你的问题我收集到你理解它。