Primefaces OmniFaces加载/卸载ViewScopedBean

Primefaces OmniFaces加载/卸载ViewScopedBean,primefaces,jsf-2.2,omnifaces,Primefaces,Jsf 2.2,Omnifaces,为了缩小讨论范围,我们正在从JBoss6EAP(JSF2.1)升级到JBoss7EAP(JSF2.2)。我们的工作应用程序现在在OmniFaces ViewScoped bean方面存在问题 版本: 莫哈拉2.2.14 第2.6.9条 第6.2.5条 我们有这样一个数据表: <p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row" rowKey="#{row.id}" filterEven

为了缩小讨论范围,我们正在从JBoss6EAP(JSF2.1)升级到JBoss7EAP(JSF2.2)。我们的工作应用程序现在在OmniFaces ViewScoped bean方面存在问题

版本:

  • 莫哈拉2.2.14
  • 第2.6.9条
  • 第6.2.5条
我们有这样一个数据表:

<p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row"
        rowKey="#{row.id}" filterEvent="enter" 
        lazy="true"
        value="#{bean.lazyDataModel}"
        rows="15">
<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>
    <f:metadata>
        <o:viewParam name="id" value="#{legalHoldForm.legalHold}" required="false" />
        <f:event type="preInvokeAction" listener="#{controller.initializeViewLegalHold}" />
   </f:metadata>
我们将@PostConstruct添加到我们的ViewScope 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>

法律保留编辑
/legal/legal-hold-edit.xhtml
现在有趣的是,如果我们删除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>

法律保留编辑
/legal/legal-hold-edit.xhtml
作为补充说明,我们的结果页面使用o:viewparam接收参数,如下所示:

<p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row"
        rowKey="#{row.id}" filterEvent="enter" 
        lazy="true"
        value="#{bean.lazyDataModel}"
        rows="15">
<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>
    <f:metadata>
        <o:viewParam name="id" value="#{legalHoldForm.legalHold}" required="false" />
        <f:event type="preInvokeAction" listener="#{controller.initializeViewLegalHold}" />
   </f:metadata>

因此,我的问题是:

  • 为什么删除“include view params”可以让它工作
  • 这与最近的ViewScope问题类似吗
    这似乎是Mojarra中的一个bug。它在为另一个视图计算视图参数时间接调用
    PreDestroyViewMapEvent

    在呈现响应阶段,当要生成
    UIOutcomeTarget
    组件(例如
    )的URL,并且
    includeViewParams
    设置为
    true
    (在导航案例中定义)时,它需要查阅目标视图的所有
    。为了实现这一点,它需要构建它的
    UIViewRoot
    实例

    但是,它实际上临时将新的
    UIViewRoot
    设置为faces上下文的当前视图根,以便访问
    。它将恢复原始视图,但这是在Mojarra中出错的地方。它实际上应该在恢复原始视图后执行此操作

    目前,您最好针对Mojarra报告此问题,并避免将
    includeViewParams
    与OmniFaces
    @ViewScoped

    问题报告结合使用:

    公共关系部提供:

    此修复程序将包含在Mojarra的2.3.15、3.0.1和4.0.0中