1

私は以下を私の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)

これが標準だと思います。

4

2 に答える 2

3

これは、 -ViewExpiredException他のすべてのようにFacesException-がカバーの下にあるためServletExceptionです。これは、宣言されたエラーページで一致を見つけるために使用されます。最も近い一致はjava.lang.Throwableであるため、関連するエラーページが表示されます。

一致するものが見つからなかった場合は、の根本的な原因ServletExceptionがラップ解除され、ラップされていない例外を使用して、宣言されたエラーページの2回目のパスが実行されます。エントリを削除するjava.lang.Throwableと、これが機能することがわかります。

を保持したい場合、あなたができる最善のことは、から任意のものをアンラップしてそれを再スローjava.lang.Throwableするを作成することです。FilterFacesExceptionServletException

参照:

于 2011-01-17T20:01:44.657 に答える
0

ここで同様の問題について投稿されたブログを参照してください:それはそれほど面倒ではなく、非常に効果的です。「アプリケーション」タグ内に「view-handler」タグを含めるようにしてください。これを行うと、私にとってはうまくいきました。

于 2012-09-01T21:14:40.887 に答える