1

以下の抜粋に示すように、 f:viewParamを使用して、以下に示すように xhtml ページにf:metadataセクションを定義しました。

<html xmlns="http://www.w3.org/1999/xhtml" (...)>

<f:metadata>
    <f:viewParam name="cust-id" value="#{CustomerCEVController.customer}" 
        converter="#{customerConverter}" converterMessage="blah blah."
        required="false"
    />
</f:metadata>


    <ui:composition template="/templates/commonLayout.xhtml">
        <ui:define name="title">
        (...)
        <ui:define name="body">
        (...)

.. cust-idパラメータの CustomerConverter クラスを宣言しました。プロパティ cust-id のコンバーター クラス getAsObject メソッドとバッキングBeanカスタマーフィールドのゲッター メソッドすべて、 UPDATE MODEL VALUESライフで呼び出されるカスタマーフィールドのセッター メソッドの前に呼び出されるPROCESS VALIDATIONS JSF ライフサイクル フェーズで呼び出されます。サイクルフェーズ。その結果、ゲッターが呼び出された時点で、フィールドはコンバーターによって適切に初期化されません。したがって、シーケンスは次のようになります (ここで、CustomerCEVController はバッキング Bean クラスです)。

[ PROCESS VALIDATIONS フェーズ開始 ]
[CustomerConverter#getAsObject が呼び出されました]
[CustomerCEVController#getCustomer が呼び出されました]
[ PROCESS VALIDATIONS フェーズが終了しました ]
[ UPDATE MODEL VALUES START ]
[CustomerCEVController#setCustomer が呼び出されました]

ログ出力の散在と登録したライフサイクル リスナーに基づいてシーケンスを報告しています。何か不足していますか?そうでない場合、顧客フィールドがアクセスされる前にコンバーターによって適切に設定されていることを確認するにはどうすればよいですか?

4

1 に答える 1

4

シーケンスはまったく問題ありません。なぜこれがあなたにとって問題になるのか、私にはわかりません。おそらく、getter または setter で何らかのビジネス ジョブを実行しているのに、それらのメソッドにはまったく属していないのではないでしょうか? <f:event type="preRenderView">そのビジネス ジョブを実行するには、代わりに が必要です。

getter は、検証フェーズの終了時に呼び出されます。これは、その時点で a を公開するかどうかが決定されるためValueChangeEventです。そのためには、最初の (「古い」) 値が必要です。この値は、送信/変換/検証済み (「新しい」) 値と比較されます。これらの値が等しくない場合、どちらも公開された の「古い」値と「新しい」値として渡されValueChangeEventます。

于 2012-08-02T10:54:35.140 に答える