【问题标题】:Causes for IllegalStateExceptionIllegalStateException 的原因
【发布时间】:2013-03-25 06:38:09
【问题描述】:

当我尝试将 JSP 的数据保存在 EXCEL 中时,我从 Tomcat 服务器收到 IllegalStateException。 IllegalStateException 可以出现在以下任何一种情况:

  • 如果sendRedirect()后面没有return语句。
  • 如果 POST 大小大于 2MB。
  • 如果页面缓冲区大小较小。

除此之外,IllegalStateException还有什么原因吗?

我的代码:

response.sendRedirect(response.encodeRedirectURL(request.getRequestURI() + "?saveToFile=true&action=" + ReportsManager.ACTION_SAVE_AS_XLS + "&saveFileName=" + saveFileName + "&returnPage=" + StringFunctions.encodeUrlParameter(returnPage)));    
return;

我在 sendRedirect() 收到 IllegalStateException

另外,如果 JSP 中只有很少的记录(比如 100 行),那么保存为 Excel 不会出错。如果有 1000 条记录,那么我会收到 IllegalStateException

堆栈跟踪:

*Mar 25, 2013 6:57:26 AM,JSP Runtime Error,0,java.lang.IllegalStateException
       at org.apache.coyote.tomcat5.CoyoteResponseFacade.sendRedirect(CoyoteResponseFacade.java:352)
       at org.apache.jsp.OperationalReports.SalespersonSales_jsp._jspService(SalespersonSales_jsp.java:2567)
       at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
       at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
       at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
       at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
       at com.retailJava.core.filters.SecurityFilter.doFilter(SecurityFilter.java:136)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
       at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
       at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
       at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
       at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
       at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
       at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
       at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
       at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
       at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
       at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
       at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
       at java.lang.Thread.run(Thread.java:595)

如果我设置页面缓冲区大小,那么它适用于 1000 条记录。但如果它达到 2000 条记录,那么我又遇到了问题。

<%@ page buffer = "2048kb" autoFlush = "true" %>

【问题讨论】:

  • 为什么不显示相关代码?它可能会有所帮助。
  • 添加了导致问题的代码。
  • 你能发布堆栈跟踪吗?
  • “在 EXCEL 中保存 JSP 的数据” 到底是什么意思?

标签: java jsp illegalstateexception tomcat5.5


【解决方案1】:

Documentation 声明:

sendRedirect 抛出:IllegalStateException - 如果此响应已提交

由于禁用 maxPostSize 并不能解决问题(根据 OP cmets),因此似乎在更早的时候响应正在提交。

您可以通过检查isCommited 标志来验证这一点。

【讨论】:

  • 有没有办法解决这个问题?从 Tomcat 配置文档中我得到以下建议:我们可以在 Tomcat 的 server.xml 中添加以下属性“maxPostSize”。默认情况下,这将设置为 2MB。通过将此设置为 0,我们可以禁用大小检查。但这似乎并不能解决问题。
  • 明白了。多谢,伙计。正如您所说,如果有大量数据,则将提交响应。 :) 需要验证它为什么被提交。
【解决方案2】:

如果你调用了两次“response.sendRedirect()”方法, 或者 url 是一个错误的 url,这个错误可能会导致

【讨论】:

    【解决方案3】:

    在不同的用例中遇到相同的错误。

    用例:在 Hibernate 中,当我们在有意关闭会话后尝试访问会话对象上的任何方法时。

    Session session = /*Getting session object using factory*/
    tx = session.beginTransaction();
    System.out.println("Flush Mode before closing session -> " +session.getFlushMode());
    
    session.close();
    System.out.println("Flush Mode after closing session -> " + session.getFlushMode());
    

    关键点

    • 由于在适当的时间调用方法而发生 IllegalStateException
    • 在会话上下文中,一旦会话关闭,我们就无法调用会话的任何方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多