java.lang.IllegalStateException: 已经为此请求调用了 getReader()

新手上路,请多包涵

我想将日志记录添加到我的 Servlet,所以我创建了过滤器,它应该显示请求并转到 Servlet。但不幸的是我遇到了异常:

 java.lang.IllegalStateException: getReader() has already been called for this request
    at org.apache.catalina.connector.Request.getInputStream(Request.java:948)
    at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:338)
    at com.noelios.restlet.ext.servlet.ServletCall.getRequestEntityStream(ServletCall.java:190)

所以为了解决这个问题,我找到了 Wrapper 的解决方案,但它不起作用。我还能在代码中使用/更改什么?有任何想法吗?

[MyHttpServletRequestWrapper]

 public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
{
    public MyHttpServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    private String getBodyAsString()
    {
        StringBuffer buff = new StringBuffer();
        buff.append(" BODY_DATA START [ ");
        char[] charArr = new char[getContentLength()];
        try
        {
            BufferedReader reader = new BufferedReader(getReader());
            reader.read(charArr, 0, charArr.length);
            reader.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        buff.append(charArr);
        buff.append(" ] BODY_DATA END ");
        return buff.toString();
    }

    public String toString()
    {
        return getBodyAsString();
    }
}

[我的过滤器]

 public class MyFilterimplements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        final HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        final HttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(httpServletRequest);
        final String requestBody = requestWrapper.toString();

        chain.doFilter(request, response);
    }
}

原文由 lukastymo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

Looks like the restlet framework has called getRequestEntityStream() on the Request object which in turn calls getInputStream() , so calling getReader() on the request throws IllegalStateException . getReader() 和 getInputStream() 的 Servlet API 文档说:

  public java.io.BufferedReader getReader()
    ...
    ...
Throws:
    java.lang.IllegalStateException - if getInputStream() method has been called on this request

 public ServletInputStream getInputStream()
    ...
    ...
    Throws:
    java.lang.IllegalStateException - if the getReader() method has already been called for this request

从文档看来,我们不能同时调用 Request 对象的 getReader() 和 getInputStream()。我建议您在包装器中使用 getInputStream() 而不是 getReader()

原文由 Suresh Kumar 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 ContentCachingRequestWrapper 类。在 thi 中包装 HttpServletRequest 将解决问题

示例:如果你想转换你的 “HttpServletRequest servletRequest” ,你可以做一些事情

import org.springframework.web.util.ContentCachingRequestWrapper;

ContentCachingRequestWrapper request = new ContentCachingRequestWrapper(servletRequest);

希望能帮助到你!!!

原文由 Swarit Agarwal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题