有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泽西:错误跟踪:java。lang.IllegalStateException:实体输入流已关闭

我和泽西2号一起工作。十,

下面是我的控制器

@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

}

下面是我在同一个控制器类中记录请求的方法

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.

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


共 (1) 个答案

  1. # 1 楼答案

    我有一个类似的需求,我解决这个问题的方法是在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();
    
    . . .