javax.faces.application.ViewExpiredException, казалось бы, игнорируется - PullRequest
1 голос
/ 17 января 2011

Я поместил в свой 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 не поднимается? Я ищу самую простую возможную настройку срока действия и, конечно же, это все, что необходимо в веб-дескрипторе.

Спасибо

EDIT

Теперь у меня в файле 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 ]

3 голосов
/ 17 января 2011

Это потому, что ViewExpiredException - как и все остальные FacesException - находится под одеялом, завернутым в ServletException. Этот используется для поиска совпадений на объявленных страницах ошибок. Самое близкое совпадение - java.lang.Throwable, и, таким образом, отображается соответствующая страница ошибки.

Если бы совпадение не было найдено, то основная причина ServletException была бы развернута, и был бы сделан второй проход через объявленные страницы ошибок с развернутым исключением. Если вы удалите запись java.lang.Throwable, вы увидите, что это будет работать.

Если вы хотите сохранить java.lang.Throwable, то лучше всего создать Filter, который разворачивает любой FacesException из ServletException и отбрасывает его.

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

0 голосов
/ 02 сентября 2012

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

...