0

JSF 例外の原因をデバッグする方法や、以前にこの動作を見たことがある人がいるかどうかについてアドバイスをお願いします。問題を説明するために、次の表記を使用します。

  • 「A」 - ページ A を表示することを意味します。
  • 'A, CmdLink => B' -<h:commandLink>ページ A のリンクをクリックした後にページ B を表示することを意味し、
  • 「A, URL => B」 - アドレスバーに URL を入力し、ページ A の表示中に Enter キーを押して、ページ B を表示することを意味します (したがって、JSF はまだ以前にページ A を生成しています)。

私は次のようになりますjava.lang.ClassCastException

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Map
at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:225)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:452)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:189)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)

次の順序でページ B のリンクをクリックすると:

  • A、CmdLink => B、CmdLink => C

そのため、ページ C の代わりに例外のあるエラー ページが表示されます。ただし、次のシナリオではエラーは生成されません。

  • A、URL => B、CmdLink => C
  • D、CmdLink => B、CmdLink => C

そして、このシーケンスは 2 回目はエラーを生成しないため、ページ C が正しく表示されます。

  • A、CmdLink => B、CmdLink => ErrorPage (C の代わり)、URL => B、CmdLink => C

例外が発生するのは、ページ A がページ B に対して以前に表示されたページであった場合 (および、ブラウザーのアドレス バーに URL を直接入力してもページ B に到達しなかった場合) のみです。

ページ A は、複数のドロップダウン ボックス、RichFaces コンポーネント、OpenFaces タブセット、複数のデータテーブルを含む複雑なページであり、RichFaces AJAX (a4j) を使用しますが、ページ B はこれらのいずれも使用せず、コマンド リンクを含む単純なフォームのみを使用します。どちらのページも同じ JSF テンプレート階層を使用しています。(ページ B は、ページ A のタブ セクションにあるデータテーブルにリストされているアイテムの 1 つの単純な編集ページです。)

この問題は、ページ A の次のページであるページ B に限定されません。このシーケンスでは、ページ E のリンクをクリックした後に表示されるエラー ページでも同じ例外が発生します。

  • A、CmdLink => E、CmdLink => F

ページ B のリンクをクリックすると、次の出力が生成されるフェーズ リスナーを追加しようとしました。

INFO: ++++++ START PHASE RESTORE_VIEW 1 ++++++
INFO: ++++++ END PHASE RESTORE_VIEW 1 ++++++

NetBeans 7.2、Glassfish 3.1、RichFaces 4.3.3 Final、OpenFaces 3.0、および JSF 2.1 を使用しています。

この問題を解決する方法について、有益な提案をいただければ幸いです - ありがとう。

4

1 に答える 1

0

ページA(別のタブ)に別のリンク(CmdLinkA2と呼ぶ)があったため、この問題を解決できました。

  • A、CmdLinkA2 => B、CmdLink => C

上記のエラー メッセージは表示されず、ページ C は正しく表示されます。<h:commmandLink>ページ A で問題のあるものと動作するもの (CmdLinkA2) に使用されたさまざまなバッキング Bean アクション メソッドを比較すると、String問題のある CmdLink に返されたものが最後に欠落?faces-redirect=trueしていました。つまり、次のようになります。

1)<h:commandLink value="Next page" action="nextpage.xhtml" />

それ以外の:

2)<h:commandLink value="Next page" action=nextpage.xhtml?faces-redirect=true" />

ここで、(1) ページ C の代わりにエラー メッセージが表示されます。

ただし、この質問で説明したように、ページ A には送信するフォーム データがないため、POST を使用してページ間のナビゲーションを実行すべきではないことがわかりました。

于 2013-09-26T11:46:21.793 に答える