今日 (2012 年 4 月)、MyFaces と Mojarra の JSF 2.1 実装の両方に、部分的な状態の保存に関する欠陥があり、PARTIAL_STATE_SAVING を false に設定する必要があるようです。
これは本当ですか?
PARTIAL_STATE_SAVING を false に設定する必要がありますか?
Web アプリケーションの部分的な状態の保存に関連する一般的な欠陥が発生した場合にのみ、他の方法で解決/回避することはできません。つまり、部分的な状態の保存には、全体的なパフォーマンスとメモリ使用量に関して大きな利点があります。JSF が UI コンポーネントの状態をサーバーに保存する理由も参照してください。
MyFaces について 100% 確実に話すことはできませんが、Mojarra では、部分的な状態の保存に関する問題の根本原因は、タグ ハンドラーの属性をバインドしているときに明らかになります (タグ ハンドラーはrendered
、タグに属性がないことで認識できます)。 JSTL タグなど) をビュー スコープ Bean に結合する場合、または JSF コンポーネントのid
またはbinding
属性をビュー スコープ Bean にバインドする場合 (これらの属性は、ビューの構築/復元中に解決されます)。
この問題は、JSF の問題 1492およびJSF 仕様の問題 787で説明されている鶏卵の問題によって引き起こされます。: 部分状態の保存が有効になっていると、ビュー スコープの Bean が部分ビュー状態で保存されました。したがって、ビュー スコープ Bean を抽出するには、部分的なビュー状態を復元する必要があります。ビューの復元 (構築) 中に、前述のすべての属性の EL が評価されます。ただし、その時点で使用可能なビュー スコープの Bean インスタンスがないため、新しい 1 つのインスタンスが作成されます。ただし、これにはすべてのプロパティがデフォルトに設定されます。ビューを復元し、元のビュー スコープ Bean を取得した後、それらはビュー スコープに戻され、ビューの復元中に作成された (一時的な) インスタンスがオーバーライドされます。しかし、これらの属性の EL 式は、完全に異なるインスタンスに基づいて既に評価されており、復元することはできません。
この鶏卵の問題は、Mojarra 2.1.18 および 2.2.0 以降、ビュー スコープの Bean をセッションに保存することで解決されています。何らかの理由でアップグレードできない場合は、 に設定javax.faces.PARTIAL_STATE_SAVING
して部分的な状態の保存を無効にすることで実際に解決できfalse
ます。別の方法は、前述の属性をビュー スコープの Bean にまったくバインドせず、別の解決策を探すことです。
代わりにを設定することもできますjavax.faces.FULL_STATE_SAVING_VIEW_IDS
。これにより、部分的な状態の保存をオフにする必要があるすべてのビュー ID のコンマ区切りリストを指定できます。
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/some.xhtml,/other.xhtml</param-value>
</context-param>
これにより、部分的な状態の保存から最大限の利益を得て、部分的な状態の保存に関連する問題を実際に修正できないビューのサブセットに対してのみオフにすることができます。