0

非常に奇妙なエラーがあります: ビュー ID の保存されたビュー ステートが見つかりませんでした: /mypage.xhtml
問題は、ユーザー/実行のわずか 10% にランダムに表示されることです。

アプリケーション サーバー: Apache Tomee 1.5.2 安定版 / 1.6.0-2013.09.20 dev (両方で発生します)。それぞれに付属の MyFaces ディストリビューションを使用しているので、2.1.10 / 2.1.12 であり、新しいものは何も追加されていません。

web.xml の一部:

      <context-param>
        <param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
        <param-value>false</param-value>
      </context-param>
      <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
      </context-param>

したがって、状態はクライアント上にあるため、状態ビューの例外は発生しません。以前はサーバーに設定されていましたが、クライアントが修正するのではないかと思っていましたが、何もありませんでした。実際、そのエラーの発生に違いはありませんでした。

実行フロー:
1. クライアントが xhtml ページ (JSF) を開きます。
2. クライアントは、JSF @ViewScoped ManagedBean の public void メソッドに接続されたボタンでさまざまなことを行うコマンド ボタンをクリックします。
3. はい、別のページにリダイレクトするために文字列を返す必要がないため、このメソッドは無効です。/page/id (例: /market/24、/profile/43) にリダイレクトする必要があるため、次を使用するため、ナビゲーションの目的地として文字列を返すメソッドは役に立ちませんFacesContext.getCurrentInstance().getExternalContext().redirect(path);
。完全に機能し、ユーザーは特定の各ページにリダイレクトされます。残りの〜10(ランダム)で、彼らは得るNo saved view state could be found for the view identifier: /pagename.xhtml

どうすれば直るか分からないので、ここで助けていただければ幸いです。
よろしくお願いします。

PS。私は PrimeFaces を使用しており、web.xml には独自のフィルターがいくつかありますが、問題にはならないはずです。

ページの 1 つのスタック トレース:

25-Sep-2013 07:39:26.380 SEVERE [http-bio-80-exec-15] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception [/dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.xhtml] with root cause
 javax.faces.application.ViewExpiredException: /dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.xhtml
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:132)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:199)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.ActivateAccountFilter.doFilter(ActivateAccountFilter.java:37)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.SecurityFilter.doFilter(SecurityFilter.java:36)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.ForceFreshPageAndWWWFilter.doFilter(ForceFreshPageAndWWWFilter.java:49)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)
4

2 に答える 2

0

MyFaces と Tomee のフォーラム/メーリング リストで長い議論を重ねた結果、この問題を解決する方法は次のとおりです。このプロジェクトの JSF 実装を Majorra 2.1.26 に切り替えましたエラーは今のところ表示されなくなりました。

このバグは意味がなく (私のプロジェクトと MyFaces の両方のソースを確認した後)、再現できなかったため、実際に修正を見つけることはできませんでしたが、少なくとも Majorra では発生しませんでした。これは、他の誰かがこのエラーを受け取った場合に役立ちます。

言及: これは、多くの JSF 開発者が取得する基本的な「保存されたビュー ステートが見つかりませんでした」ではありません。それはどこかに隠れている別の何かです。

于 2013-10-29T09:28:13.857 に答える
0

この問題はよく理解されており、サーバーが再起動されるか、アプリケーションが再デプロイされると、デフォルトで新しい暗号化キーが生成されるために発生します。解決策は、独自のキーを生成し、web.xml ファイルに設定することです。このように、MyFaces は常に同じキーを使用します。http://wiki.apache.org/myfaces/Secure_Your_Applicationを参照してください。

説明では、暗号化が無効になっていると主張していますが、コードを確認したところ問題ありません。期待どおりに動作します (暗号化は事実上無効になっています)。暗号化が問題でない場合、私の意見では、アプリケーション ロジックにエラーがあります。そのようにリダイレクトを呼び出さないでください。 mypage.xhtml?faces-redirect=true を使用する標準形式を使用してください。この問題は、セッションの有効期限が原因である可能性があります (2.0/2.1 ではビュー スコープ Bean のみがクライアントに送信されますが、セッション スコープ Bean は期限切れになっていることに注意してください)。

于 2013-09-25T08:28:09.817 に答える