看似忽略了javax.faces.application.ViewExpiredException
我把以下内容放入我的web.xml:
javax.faces.application.ViewExpiredException /expiredIndex.jsf java.lang.Throwable /error.jsf 1
当我启动我的应用程序,并等待1分钟,如果我然后尝试与它交互(JSF 1.2, h:commandButton
)我得到错误
SEVERE: Servlet.service() for servlet Faces Servlet threw exception javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source)
有人能告诉我为什么它是javax.faces.application.ViewExpiredException
没被拿起? 我正在寻找可能的最基本的到期设置,并且肯定是Web描述符中所需的全部内容。
谢谢
编辑
我现在在web.xml中有以下内容:
Error myClient.ErrorFilter Error /* javax.servlet.ViewExpiredException /expiredIndex.jsf
(这些条目是web.xml中的最后一个过滤条目)和一个带有doFilter方法的新filter,如本文所述。 现在应该发生的是rootCause
应该解开ViewExpiredException,因此当servlet会话超时时,应该将用户重定向到我的expiredIndex
页面。 相反,我得到了500.在这种情况下,我无法看到我还需要做哪些正确的重定向。 救命!
编辑2
500的错误是:
javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) prismClient.ErrorFilter.doFilter(Unknown Source)
我猜这是标准的。
这是因为ViewExpiredException
– 其他所有FacesException
– 都是在ServletException
包装的。 这个用于在声明的错误页面中查找匹配项。 最接近的匹配是java.lang.Throwable
,因此显示了相关的错误页面。
如果未找到匹配项,则ServletException
的根本原因将被解包,并且将使用未解包的exception进行第二次传递声明的错误页面。 如果删除java.lang.Throwable
条目,您将看到这将起作用。
如果你想保留java.lang.Throwable
,那么你最好能做的就是创建一个Filter
,它从ServletException
解包任何FacesException
并重新抛出它。
也可以看看:
- JSF
ViewExpiredException
和多个错误页面定义的问题
请参阅此处发布的类似问题的博客:它不那么繁琐且非常有效。 一定要在“应用程序”标签中包含“view-handler”标签,这样做对我有用,欢呼。