java - JERSEY : Error Trace : java. lang.IllegalStateException: 实体输入流已经关闭

标签 java jersey-2.0

我正在使用 Jersey 2.x。

下面是我的 Controller

@GET
@Path("{id}")
@Produces("application/json")
public Response getUser(@PathParam("id") int userId, @Context ContainerRequestContext containerRequestContext) {


        ContainerRequestContext requestContext = logRequest(containerRequestContext);

        //To further operations using requestContext

}

以下是我在同一个 Controller 类中记录请求的方法

private ContainerRequestContext logRequest(ContainerRequestContext requestContext) {

        JSONObject requestData = new JSONObject();
        try {

            Map bm = null;
            ContainerRequest cr = (ContainerRequest) requestContext;

            cr.bufferEntity();

            bm = cr.readEntity(Map.class);

            if (!String.valueOf(bm).equalsIgnoreCase("null")) {
                requestData.put("parameters", bm.toString());
            }

            requestData.put("uri", requestContext.getUriInfo().getRequestUri());
            requestData.put("ClientIp", requestContext.getProperty("requesterIp"));
            requestContext.setProperty("requestData", requestData);

        } catch (IOException | NumberFormatException | ProcessingException ex) {
            //Logging

        } catch (Exception ex) {
            //Logging
        }
        return requestContext;
    }

如您所见,我正在使用 bufferEntity() 多次读取 ContainerRequestContext。

当我在我的服务器上部署我的 API 时仍然如此。

我遇到了这个错误:

Error Trace : java.lang.IllegalStateException: Entity input stream has already been closed.

我在这里做错了什么。 如果有人能向我解释这种行为,我将不胜感激。

最佳答案

我有一个类似的要求,我解决这个问题的方法是在 Apache Commons 的 IOUtils 的帮助下“克隆”请求实体,如下面的代码片段:

//--- Create a new InputStream with the original entity ---//
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(requestContext.getEntityStream(), baos);
InputStream originalEntity = new ByteArrayInputStream(baos.toByteArray()));

//--- Reasign the original entity to Request Context ---//
requestContext.setEntityStream(new ByteArrayInputStream(baos.toByteArray()));

//--- From this point onwards, you can do whatever you want with the original request entity ---//

. . .

//--- In my case, I am working with JsonObject as below (try/catch ommited for brevity) ---//
JsonReader jsonReader = Json.createReader(originalEntity);
JsonObject requestEntity = jsonReader.readObject();

. . .

关于java - JERSEY : Error Trace : java. lang.IllegalStateException: 实体输入流已经关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585665/

相关文章:

java - 从 FTP 服务器下载文件时如何显示 JProgressBar

java - 通过 Web 套接字的应用程序到应用程序通信

java - Jersey 2.26 : register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier

jersey-2.0 - Jersey(2.10.4) 实体提供者选择算法对自定义提供者(MessageBodyWriter)的优先级较低,使其不被调用

xml - Jersey 2 (JAXB) XML 元素案例,列表不支持 XmlRootElement

java - 通过 id 查找父 View

java - Hibernate 查询 "or condition"将不起作用

java - Jersey 远程 IP 地址无法正常工作

java - Jersey 2.x 不支持POJO转json?

java - 数组不返回字符串