Java 如何在不清除BufferedReader的情况下读取它

Java 如何在不清除BufferedReader的情况下读取它,java,spring,Java,Spring,在调用SpringRestController之前,我需要记录请求的主体。 为此,我使用HandlerInterceptorAdapter并执行以下操作: if (request.getReader() != null) { String s; String body = ""; while ((s = request.getReader().readLine()) != null) { body += s; } if (!StringUt

在调用SpringRestController之前,我需要记录请求的主体。 为此,我使用HandlerInterceptorAdapter并执行以下操作:

if (request.getReader() != null) {
    String s;
    String body = "";
    while ((s = request.getReader().readLine()) != null) {
        body += s;
    }
    if (!StringUtil.isBlankOrNull(body)) {
        JSONObject jsonBody = new JSONObject(body);
        return jsonBody.toString(2);
    }
}
我的问题是读卡器在此之后是空的,它在调用RestController之前崩溃


如何在不清除BufferedReader的情况下读取请求的正文?

您只能读取一次请求。您必须包装请求并重置它。此外,Spring已经有了用于记录日志的过滤器,我建议您使用这些过滤器,而不是自己滚动(或者查看它们以获取灵感:)。@M.Deinum完全不正确。这就是
mark()
reset()
的用途。但是
mark()
reset()
取决于(通常)缓冲区大小,缓冲区大小不一定是安全的,不适用于基于请求的读卡器。在解析流之后,Yu只能读取流一次,您将得到一个异常。Reset/mark通常不适用于
HttpServletRequest
是我的经验。我只是尝试在request.getReader()上使用mark()和Reset(),正如@M.Deinum所说,它不起作用。我还尝试用apacheioutils复制阅读器,但这会在创建副本时读取原始阅读器。