簡単に言うと、現在取り組んでいるアプリケーションで MyFaces への移行を試しているところ、ViewStateのサイズが 1 ページで 18 MB を超えていることに気付きました。これは、このページに 10 を超えるフォームがあるためだと思われます。これは、このページに 10 を超える ajax 化された PrimeFaces ダイアログがあり、Ajax ダイアログには独自の内部フォームが必要であるためです。ViewState は各フォームで指数関数的に成長するようです。MyFaces は ViewState に関して効率がはるかに優れていると読んだので、結果をプロファイリングするためにアプリケーションのプロトタイプを作成しようとしています。
Mojarra ではまったく問題にならなかった特定の使用例に気付きました。
- PrimeFaces データ テーブルがあります
- 行の編集ボタンをクリックします
- 選択した行がモデルに更新されます
- 編集ダイアログのフォームをレンダリングして、選択した行のマネージド Bean 値を表示します
- Edit ボタン
oncomplete
属性は、ダイアログを表示するスクリプトを実行します。 - ユーザーがフォームを送信する通常の LOB データ入力フォーム
- DB に永続化
- Ajax は、そのレコードの新しい値でデータ テーブルをレンダリングします。
MyFaces の問題は、データ テーブルの選択された値が null である場合に NullPointerException をスローすることにより、EL 式がよりうるさいことのようです。これは、Mojarra では (善悪を問わず) 発生しませんでした。例えば。
<h:form>
<p:dataTable var="bla" selection="#{managedBean.selectedValue}" ...>
<p:column header="Options">
<p:commandButton ajax="true" value="Edit" process="@this" update=":editDialogForm"
oncomplete="editDialogWidget.show()" />
</p:column>
...
</p:dataTable>
</h:form>
....
<p:dialog widgetVar="editDialogWidget" header="Edit stuff" ...>
<h:form id="editDialogForm">
<h:inputText value="#{managedBean.selectedValue.someHibernateProperty}" />
...
</h:form>
</p:dialog>
これがどこで NPE になるかははっきりとわかりますが、EL 式でこの点で Mojarra のように動作するように、MyFaces で使用できるコンテキスト パラメーターがあるかどうか疑問に思っていました。そうでない場合、これはまったく機能しないはずの Mojarra のバグですか?