IllegalStateException:已为此请求调用 getInputStream()
Posted
技术标签:
【中文标题】IllegalStateException:已为此请求调用 getInputStream()【英文标题】:IllegalStateException: getInputStream() has already been called for this request 【发布时间】: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()));
【问题讨论】:
【参考方案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() 中添加调试。以上是关于IllegalStateException:已为此请求调用 getInputStream()的主要内容,如果未能解决你的问题,请参考以下文章
如何修复“getOutputStream() 已为此响应调用”
java.lang.IllegalStateException: getOutputStream() 已经为此响应调用
java.lang.IllegalStateException: getReader() 已经为此请求调用
我收到一个异常:java.lang.IllegalStateException: getOutputStream() 已经为此响应调用
MyFaces 1.2 的应用程序错误:java.lang.IllegalStateException:没有为此应用程序配置工厂