看似忽略了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”标签,这样做对我有用,欢呼。