gpt4 book ai didi

primefaces - OmniFaces 加载/卸载 ViewScopedBean

转载 作者:行者123 更新时间:2023-12-05 00:47:39 25 4
gpt4 key购买 nike

为了缩小我们的问题,我们正在从 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com