作者:手机用户2502873393 | 来源:互联网 | 2022-12-10 13:43
为了缩小范围,我们正在从Jboss 6 EAP(JSF 2.1)升级到Jboss 7 EAP(JSF 2.2)。我们的工作应用程序现在遇到OmniFaces ViewScoped bean问题。
版本:
Mojarra 2.2.14
OminFaces 2.6.9
PrimeFaces 6.2.5
我们有一个这样的数据表:
注意:我们的bean是OmniFaces ViewScoped,此时我们的表工作正常!
问题:
接下来,我们添加一列,其中包含到新页面的导航,如下所示:
现在我们的bean立即被加载和卸载,如果我们执行HTML的查看源,我们将看到Omnifaces脚本被添加了两次,就像这样……
OmniFaces.Unload.init('f1c1ff81-c87f-4406-b98f-a3eaff977e96');
OmniFaces.Unload.init('45e7de9d-53c7-4426-a972-797c48c46733');
我们在ViewScoped bean中添加了@PostConstruct,以证明它被两次调用。对于该导航,我们的faces-config.xml看起来像这样。
legal-hold-edit
/legal/legal-hold-edit.xhtml
现在有趣的是,如果我们删除faces-config.xml中的“ include-view-params”,就像下面的代码一样,一切将开始正常运行,则只创建了一次ViewScoped bean,并且仅向其中添加了1个OmniFaces.Unload.init脚本。页。
legal-hold-edit
/legal/legal-hold-edit.xhtml
另外要注意的是,我们的结果页使用o:viewparam接收如下参数:
所以我的问题是:
为什么删除“ include-view-params”使其起作用?
这是与最近的ViewScoped问题类似的错误吗?:https : //github.com/omnifaces/omnifaces/issues/463
BalusC..
5
这似乎是Mojarra中的错误。PreDestroyViewMapEvent
在为另一个视图找出视图参数时,它间接调用。
在渲染响应阶段,当要生成UIOutcomeTarget
组件的URL (例如
)并将includeViewParams
其设置为true
(如您的导航情况所定义)时,则它需要查阅所有
目标视图。为了实现这一点,它将需要构建UIViewRoot
它的一个实例。
但是,实际上它是将new临时设置UIViewRoot
为faces上下文的当前视图根,以便访问
。它将恢复原始视图,但这就是Mojarra中出现问题的地方。恢复还context.setProcessingEvents(true)
为时过早。恢复原始视图后,它实际上应该已经完成了。
目前,最好的办法是针对Mojarra报告此问题,并避免includeViewParams
与OmniFaces结合使用@ViewScoped
。
1> BalusC..:
这似乎是Mojarra中的错误。PreDestroyViewMapEvent
在为另一个视图找出视图参数时,它间接调用。
在渲染响应阶段,当要生成UIOutcomeTarget
组件的URL (例如
)并将includeViewParams
其设置为true
(如您的导航情况所定义)时,则它需要查阅所有
目标视图。为了实现这一点,它将需要构建UIViewRoot
它的一个实例。
但是,实际上它是将new临时设置UIViewRoot
为faces上下文的当前视图根,以便访问
。它将恢复原始视图,但这就是Mojarra中出现问题的地方。恢复还context.setProcessingEvents(true)
为时过早。恢复原始视图后,它实际上应该已经完成了。
目前,最好的办法是针对Mojarra报告此问题,并避免includeViewParams
与OmniFaces结合使用@ViewScoped
。