簡體   English   中英

IllegalStateException 的原因

[英]Causes for IllegalStateException

當我嘗試在 EXCEL 中保存 JSP 的數據時,我從 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" %>

文檔指出:

sendRedirect拋出:IllegalStateException - 如果此響應已提交

由於禁用 maxPostSize 並不能解決問題(根據 OP 評論),似乎在更早的時候響應正在提交。

您可以通過檢查isCommited標志來驗證這一點。

如果你調用兩次“response.sendRedirect()”方法,或者url是一個錯誤的url,這個錯誤可能會導致

在不同的用例中遇到相同的錯誤。

在此處輸入圖片說明

用例:在 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
  • 在 session 上下文中,一旦關閉,我們就不能調用 session 的任何方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM