长话短说,当我注意到单个页面的 ViewState大小超过 18MB时,我正在尝试在我正在开发的应用程序上迁移到 MyFaces。我怀疑这是因为我在这个页面上有超过 10 个表单,这是必要的,因为该页面有超过 10 个 ajaxified PrimeFaces 对话框,而 Ajax 对话框需要它们自己的内部表单。ViewState 似乎随着每种形式呈指数增长。我读到 MyFaces 在 ViewState 方面的效率要高得多,因此我正在尝试对我的应用程序进行原型化以分析结果。
我注意到一个特定的用例,它从来不是 Mojarra 的问题:
- 我有一个 PrimeFaces 数据表
- 单击一行上的编辑按钮
- 所选行更新为模型
- 我呈现编辑对话框的表单以显示所选行的托管 bean 值
- 编辑按钮
oncomplete
属性执行显示对话框的脚本。 - 用户提交表单的普通 LOB 数据输入表单
- 坚持到数据库
- Ajax 使用该记录的新值呈现数据表
MyFaces 的问题似乎是它对 EL 表达式更加挑剔,如果它恰好为 null,则在数据表选定值上抛出 NullPointerException。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,但我想知道是否有一个上下文参数可以在 MyFaces 中使用,以便它在这方面与 EL 表达式表现得像 Mojarra?如果不是,那么这是 Mojarra 的一个错误,它根本不应该起作用?