2

JSPのデータをEXCELに保存しようとすると、TomcatサーバーからIllegalStateExceptionが発生します。IllegalStateException次のいずれかの状態で発生する可能性があります。

  • の後にreturnステートメントがない場合sendRedirect()
  • POSTサイズが2MBより大きい場合。
  • ページバッファサイズが小さい場合。

これ以外に原因はありIllegalStateExceptionますか?

私のコード:

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

IllegalStateExceptionsendRedirect()を取得しています。

また、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" %>
4

3 に答える 3

3

ドキュメントには次のように記載されています。

sendRedirect Throws:IllegalStateException-この応答がすでにコミットされている場合

maxPostSizeを無効にしても問題は解決しないため(OPコメントによると)、以前の時点では応答がコミットされているようです。

これは、 isCommitedフラグを確認することで確認できます。

于 2013-03-25T07:03:27.910 に答える
2

「response.sendRedirect()」メソッドを2回呼び出すか、URLが間違ったURLである場合、このエラーが発生する可能性があります

于 2013-03-25T06:55:24.817 に答える
0

異なるユースケースで同じエラーが発生します。

ここに画像の説明を入力してください

ユースケース: 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は、適切なタイミングでのメソッド呼び出しが原因で発生します
  • セッションのコンテキストでは、一度閉じられるとセッションのメソッドを呼び出すことはできません
于 2020-01-28T17:39:51.753 に答える