primefaces - OmniFaces 加载/卸载 ViewScopedBean

标签 primefaces jsf-2.2 omnifaces

为了缩小我们的问题,我们正在从 Jboss 6 EAP (JSF 2.1) 升级到 Jboss 7 EAP (JSF 2.2)。我们的工作应用程序现在存在 OmniFaces ViewScoped bean 的问题。

版本:

  • 莫哈拉 2.2.14
  • OminFaces 2.6.9
  • PrimeFaces 6.2.5

  • 我们有一个这样的数据表:
    <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>
    

    所以我的问题是:
  • 为什么删除“include-view-params”使它起作用?
  • 这是一个类似于最近的 ViewScoped 问题的错误吗? :https://github.com/omnifaces/omnifaces/issues/463
  • 最佳答案

    这似乎是 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/

    相关文章:

    validation - 如何让验证取决于按下的按钮?

    primefaces - UI 布局初始化错误 PrimeFaces 6.2

    java - 未在 @RequestScoped ManagedBean 中获取请求参数

    jsf-2 - 重定向到已配置的 <error-page> 时出现异常 (HTTP 500)

    css - p :ribbon overrides spinner's button background

    jsf-2 - Primefaces p :media not showing youtube video

    validation - 使用 Omnifaces 进行跨领域验证 : "Enter X and Y or enter Z"

    jsf - Spring/JSF 项目中的 OmniFaces 不检索枚举属性

    jsf - 对话框关闭时重定向到新页面

    primefaces - p :inputmask 中的转义数字 9