【问题标题】:IllegalStateException: getInputStream() has already been called for this requestIllegalStateException:已为此请求调用 getInputStream()
【发布时间】:2012-04-16 18:52:57
【问题描述】:

当我尝试从 HttpServletResponse 获取 Buffered Reader 时出现非法状态异常,告诉我 getInputStream 已被调用。 但是 getReader 是第一行代码,我根本没有调用 getInputStream...

服务器:

@POST
@Path("/getReport")
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_JSON)
public void getReport(@Context HttpServletRequest servletRequest, @Context HttpServletResponse servletResponse, @Context UriInfo uriInfo )
            throws ServletException, IOException{

JSONObject jobj =  new JSONObject(new JSONTokener(servletRequest.getReader()));

【问题讨论】:

    标签: java rest servlets jersey


    【解决方案1】:

    看起来 restlet 框架在 Request 对象上调用了 getRequestEntityStream(),而后者又调用了 getInputStream(),因此在请求上调用 getReader() 会引发 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()。

    【讨论】:

      【解决方案2】:

      同时写入servletRequest.getReader()servletRequest.getInputStream() 是非法的。我认为servletRequest.getInputStream() 之前也被调用过,这导致IllegalStateException

      【讨论】:

      • ummm 它是如何被调用的?我没有调用 getInputStream() 和 getReader() 是我的第一行。
      • 你能检查一下你的过滤器是否在调用。如果你想调试实现一个 RequestWrapper 并在 getInputStream() 中添加调试。
      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2012-04-13
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多