首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OmniFaces装卸ViewScopedBean

OmniFaces装卸ViewScopedBean
EN

Stack Overflow用户
提问于 2018-07-17 13:42:55
回答 2查看 307关注 0票数 4

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

版本:

  • Mojarra 2.2.14
  • OminFaces 2.6.9
  • PrimeFaces 6.2.5

我们有这样一个datatable:

代码语言:javascript
复制
<p:dataTable id="tblLegalHolds" widgetVar="tableLegalHolds" var="row"
        rowKey="#{row.id}" filterEvent="enter" 
        lazy="true"
        value="#{bean.lazyDataModel}"
        rows="15">

注意:,我们的bean是OmniFaces ViewScoped,我们的表在这一点上运行得很好!

问题:下一步,我们向新页面添加了一个包含导航的列,如下所示:

代码语言:javascript
复制
<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的View Source,我们会看到Omnifaces脚本添加了两次,如下所示.

代码语言:javascript
复制
OmniFaces.Unload.init('f1c1ff81-c87f-4406-b98f-a3eaff977e96');
OmniFaces.Unload.init('45e7de9d-53c7-4426-a972-797c48c46733');

我们在ViewScoped bean中添加了@PostConstruct,以证明它被调用了两次。对于导航,faces-config.xml看起来是这样的。

代码语言:javascript
复制
<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>

现在有趣的是,如果我们删除Facs-config.xml中的"include-view-params“,就像下面的代码开始正常工作一样,ViewScoped bean只创建一次,并且只向页面添加了一个OmniFaces.Unload.init脚本。

代码语言:javascript
复制
<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来接收这个param,如下所示:

代码语言:javascript
复制
    <f:metadata>
        <o:viewParam name="id" value="#{legalHoldForm.legalHold}" required="false" />
        <f:event type="preInvokeAction" listener="#{controller.initializeViewLegalHold}" />
   </f:metadata>

所以我的问题是:

  1. 为什么删除“包含-视图-参数”使其工作?
  2. 这与最近的ViewScoped问题类似吗?:https://github.com/omnifaces/omnifaces/issues/463
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-23 22:04:49

这似乎是莫吉拉的一个错误。在为另一个视图计算视图参数时,它间接地调用了PreDestroyViewMapEvent

在呈现响应阶段,当生成UIOutcomeTarget组件(例如,<p:button>)的URL,并将includeViewParams设置为true (如您的导航用例中定义的)时,它需要查询目标视图的所有<f:viewParam>。为了实现这一点,它需要构建一个UIViewRoot实例。

但是,它实际上暂时将新的UIViewRoot设置为faces上下文的当前视图根,以便访问<f:viewParam>。它将恢复原来的视图,但这是它在莫扎拉出错的地方。 too early。它实际上应该在恢复原始视图之后完成它。

目前,您最好的选择是针对Mojarra报告此问题,并避免将includeViewParams与OmniFaces @ViewScoped结合使用。

票数 5
EN

Stack Overflow用户

发布于 2021-03-30 19:29:17

报道:https://github.com/eclipse-ee4j/mojarra/issues/4503

提供:https://github.com/eclipse-ee4j/mojarra/pull/4730

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51382976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档