为了缩小我们的问题,我们正在从 Jboss 6 EAP (JSF 2.1) 升级到 Jboss 7 EAP (JSF 2.2)。我们的工作应用程序现在存在 OmniFaces ViewScoped bean 的问题。
版本:
我们有一个这样的数据表:
<p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row"
rowKey="#{row.id}" filterEvent="enter"
lazy="true"
value="#{bean.lazyDataModel}"
rows="15">
注意:我们的 bean 是 OmniFaces ViewScoped,我们的表此时工作正常!
问题:
接下来,我们添加一个包含导航到新页面的列,如下所示:
<p:column width="60" exportable="false">
<p:button value="Open" outcome="legal-hold-edit">
<f:param name="id" value="#{row.id}" />
</p:button>
</p:column>
现在我们的 bean 正在立即加载和卸载,如果我们查看 HTML 的源代码,我们会看到 Omnifaces 脚本像这样添加了两次......
OmniFaces.Unload.init('f1c1ff81-c87f-4406-b98f-a3eaff977e96');
OmniFaces.Unload.init('45e7de9d-53c7-4426-a972-797c48c46733');
我们将 @PostConstruct 添加到我们的 ViewScoped bean 以证明它被调用了两次。对于该导航,我们的 faces-config.xml 如下所示。
<navigation-case>
<from-outcome>legal-hold-edit</from-outcome>
<to-view-id>/legal/legal-hold-edit.xhtml</to-view-id>
<redirect include-view-params="true"/>
</navigation-case>
现在有趣的是,如果我们像下面的代码一样删除 faces-config.xml 中的“include-view-params”,一切都会开始正常工作,ViewScoped bean 只创建一次,并且只将 1 个 OmniFaces.Unload.init 脚本添加到页。
<navigation-case>
<from-outcome>legal-hold-edit</from-outcome>
<to-view-id>/legal/legal-hold-edit.xhtml</to-view-id>
<redirect/>
</navigation-case>
作为补充说明,我们的结果页面使用 o:viewparam 来接收这样的参数:
<f:metadata>
<o:viewParam name="id" value="#{legalHoldForm.legalHold}" required="false" />
<f:event type="preInvokeAction" listener="#{controller.initializeViewLegalHold}" />
</f:metadata>
所以我的问题是:
最佳答案
这似乎是 Mojarra 中的一个错误。它间接调用了 PreDestroyViewMapEvent
在计算另一个 View 的 View 参数时。
在渲染响应阶段,当 URL 为 UIOutcomeTarget
要生成组件(例如 <p:button>
),并且 includeViewParams
设置为 true
(如您的导航案例中所定义),那么它需要咨询所有 <f:viewParam>
目标 View 。为了实现这一点,它需要构建一个 UIViewRoot
它的实例。
然而,它实际上临时设置了新的UIViewRoot
作为faces上下文的当前 View 根以访问<f:viewParam>
.它将恢复原始 View ,但这就是 Mojarra 出错的地方。 It is restoring context.setProcessingEvents(true)
too early .它实际上应该在恢复原始 View 后完成。
目前,最好的办法是向 Mojarra 报告此问题并避免使用 includeViewParams
与 OmniFaces 结合使用 @ViewScoped
.
关于primefaces - OmniFaces 加载/卸载 ViewScopedBean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51382976/