【问题标题】:Resteasy Client java.lang.IllegalStateException: Response is closedResteasy Client java.lang.IllegalStateException:响应已关闭
【发布时间】:2016-02-24 07:20:58
【问题描述】:

我在 RestEasy 客户端 -3.0.8 中遇到异常

12:46:19,724 错误 [stderr] (http-localhost-127.0.0.1-8080-1) java.lang.IllegalStateException: 响应已关闭。

我写了下面的代码

client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(request.getUrl());
Response response = target.request().accept(APPLICATION_TYPE_XML).header(TOKEN, request.getToken()).post(Entity.entity(request.getXmlObject(), APPLICATION_TYPE_XML));
output = response.readEntity(String.class);
if (response.getStatus() != SUCCESS_CREATE) {
 //Do Something
} else {
 String classType = ClassFactory.getClassNameFromUrl(request.getUrl());
 if (null != classType && !classType.isEmpty()) {
  Long Id = (Long) response.readEntity(ClassFactory.getClassMethod(classType)).getId();

 }

现在这一行 Long Id = (Long) response.readEntity(ClassFactory.getClassMethod(classType)).getId(); 抛出异常。代码有什么问题?

【问题讨论】:

    标签: java resteasy


    【解决方案1】:

    读取响应会关闭响应。 所以当你打电话给response.readEntity(String.class); 当您使用response.readEntity(ClassFactory.getClassMethod(classType)).getId(); 重复读取时,这将导致错误

    您可以通过在循环中重复第一个 readEntity 来轻松展示这一点。将响应读入一次最方便的形式,并在必要时从那里转换。

    【讨论】:

      【解决方案2】:

      您可以缓冲正文响应以允许多次调用 readEntity():

      response.bufferEntity();
      

      【讨论】:

        【解决方案3】:

        你解决了吗?我也遇到过类似的问题。

        我在 WildFly 9 中运行 我的 REST 资源定义为

        @Path("fake")
        public interface FakeService {
        
             @GET
             @Produces(MediaType.TEXT_PLAIN)
             public String get();
        }
        

        以及实现

        public class Fake implements FakeService{
            public String get(){
                return "Hello";
            }
        }
        

        我的客户端代码是

        ResteasyClient client = new ResteasyClientBuilder().build();
        **ResteasyWebTarget target = client.target("http://localhost:8080/myapp/api/fake");**
        
        FakeService simple = target.proxy(FakeService.class);
        System.out.println(simple.get());
        

        查看我的“server.log”后,我发现抛出异常是因为之前有警告,

        WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-24) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: **http://localhost:8080/myapp/api/fake/fake**
        

        URL 增加一个额外的路径(fake 是两次)。我已将客户代码更改为 ResteasyWebTarget target = client.target("http://localhost:8080/myapp/api/");

        (没有我正在代理的资源的路径)并且它有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2018-09-16
          • 2015-03-19
          • 1970-01-01
          • 2014-08-01
          • 2012-09-07
          • 2023-03-08
          相关资源
          最近更新 更多