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 и отбрасывает это.

Смотрите также:

Пожалуйста, смотрите блог, опубликованный по аналогичной проблеме здесь: он менее громоздкий и довольно эффективный. Обязательно включите ваши теги "view-handler" в теги "application", у меня это получилось, ура.

Другие вопросы по тегам