java - 读取响应时出现 IllegalStateException

标签 java jersey-client

我正在使用 readEntity() 方法读取 JAVAX 响应,但我收到以下堆栈跟踪:

java.lang.IllegalStateException: Entity input stream has already been closed.
    at org.glassfish.jersey.message.internal.EntityInputStream.ensureNotClosed(EntityInputStream.java:225) ~[jersey-common.jar:?]
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:832) ~[jersey-common.jar:?]
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:785) ~[jersey-common.jar:?]

在线上

Map<String, Map> mapEntityFromResponse = res.readEntity(Map.class);

这是我的代码

 public Output getClaimsFromAPI(@NonNull final Input xyzInput)
            throws PermanentException, TransientException {
            final Response res = fetchHealBeamServiceResponse(webTarget, xyzInput);
            Object respondentMapObject;
            Map<String, Map> mapEntityFromResponse = res.readEntity(Map.class);
            if (mapEntityFromResponse != null) {
                respondentMapObject = mapEntityFromResponse.get(ServiceConstants.MAP_KEY);
                return getOutputFromResponseMap(respondentMapObject, xyzInput);
            } else {

              throw new RuntimeException("The response returned does not contain map");
            }
    }


private Response fetchHealBeamServiceResponse(WebTarget healBeamTarget,
                                                  Input xyzInput)
            throws PermanentException, TransientException {
        Response res = null;
        try {
            res = healBeamTarget
                    .path(HealBeamServiceConstants.GET_CUSTOMER_PATH)
                    .register(Configurator.getSoaOpNameFeatureForCustomerResource())
                    .resolveTemplate(ServiceConstants.ID, xyzInput.getId())
                    .request(MediaType.APPLICATION_JSON_TYPE)
                    .property(HealBeamServiceConstants.SERVICE_KEY, SOA_SERVICE_NAME)
                    .property(HealBeamServiceConstants.OPERATION_KEY, SOA_OP_NAME_GET_CUSTOMER)
                    .acceptLanguage(java.util.Locale.getDefault())
                    .get();
            if (Response.Status.REQUEST_TIMEOUT.getStatusCode() == res.getStatusInfo().getStatusCode()) {

                throw new TransientException("Request timed out with status" + res.getStatusInfo().getStatusCode());
            } else if (Response.Status.OK.getStatusCode() != res.getStatusInfo().getStatusCode()) {
          log.error("Some Error"):
            }
            return res;
        } catch (RuntimeException e) {

            throw new PermanentException("Unexpected Exception Occured, Exception Message " + e.getMessage());
        } finally {
            if (res != null) {
                res.close();
            }
        }
    }

最佳答案

您将在返回之前关闭您的响应,这就是您无法在调用方法 getClaimsFromAPI() 中读取它的原因。 只是为了演示:您认为下面发布的方法 main() 会打印什么?

public class NewApp {

    public static void main(String[] args) {

        Person p = demonstrate();
        System.out.println(p.name);
    }

    public static Person demonstrate(){

        Person person = new Person();

        try {
            person.name = "name set in try";
            return person;
        } catch (Exception ex) {
            throw ex;
        } finally {
            person.name = "name set in finally";
        }
    }
}

class Person {
    public String name;
}

关于java - 读取响应时出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539143/

相关文章:

java - Eclipse 中的实时协作

java - 监控每个线程的内存使用情况

java - 方法有8个参数,大于7个授权

java - 可运行 Jar 文件导出警告

json - JAXRS 客户端 - Pojo 的反序列化问题

jax-rs - 如何使用Jersey(JAX-RS 2.0)客户端为内容编码启用gzip压缩?

java - 如何将变量传递给tile(tiles库)

java - 使用模块初始化 Jersey 客户端的正确方法是什么?

java - 带有 x-www-form-urlencoded 的 Jersey 客户端发布请求失败

spring-boot - Jersey Rx 客户端 jersey-client-async-executor 关闭