javax.faces.application.ViewExpiredException, казалось бы, игнорируется
Я поместил следующее в мой web.xml:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/expiredIndex.jsf</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsf</location>
</error-page>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Когда я запускаю свое приложение и жду 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.xml следующее:
<filter>
<filter-name>Error</filter-name>
<filter-class>myClient.ErrorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Error</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<exception-type>javax.servlet.ViewExpiredException</exception-type>
<location>/expiredIndex.jsf</location>
</error-page>
(эти записи являются последними записями фильтра в файле web.xml) и новый фильтр с методом doFilter, как описано в этом посте. То, что должно происходить сейчас, это rootCause
должен развернуть ViewExpiredException, который должен, таким образом, перенаправить пользователя на мой 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)
который я думаю, является стандартным.
2 ответа
Это потому что ViewExpiredException
-Как каждый FacesException
- находится под одеялом, завернутым в ServletException
, Этот используется для поиска совпадений на объявленных страницах ошибок. Ближайший матч java.lang.Throwable
и, таким образом, отображается соответствующая страница ошибки.
Если совпадение не найдено, то основная причина ServletException
был бы развернут, и будет выполнен второй проход через объявленные страницы ошибок с исключением из развернутого. Если вы удалите java.lang.Throwable
запись, вы увидите, что это будет работать.
Если вы хотите сохранить java.lang.Throwable
тогда лучшее, что вы можете сделать, это создать Filter
который разворачивает любой FacesException
от ServletException
и отбрасывает это.
Смотрите также:
- Проблема с JSF
ViewExpiredException
и несколько определений страниц с ошибками
Пожалуйста, смотрите блог, опубликованный по аналогичной проблеме здесь: он менее громоздкий и довольно эффективный. Обязательно включите ваши теги "view-handler" в теги "application", у меня это получилось, ура.