自OmniFaces 2.5 FacesViews以来,@ ConversationScoped bean表现为@RequestScoped

时间:2017-02-04 10:59:25

标签: jsf cdi jsf-2.2 omnifaces

我尝试将Java EE 7 / JSF 2.2应用程序升级到Omnifaces 2.6。目前我正在运行2.4版本。 在那之后,我注意到使用@ConversationScoped和Ajax-Requests时出现了一种奇怪的行为。在调用时,应该在请求之后呈现的区域被清除(服务器上没有例外,响应状态代码200)。

接下来,我有一种基于@ConversationScoped的向导实现。它拥有一个名为ViewManager的类,它自己有一个视图列表。初始化工作正常,此列表将被填充。但不知何故,当第一个表单/视图被提交时,它会被清除(设置为null)。初始化之后永远不会调用此setter,因此我的代码不会更改它。不知何故,视图管理器实例仍然可用,只有视图管理器中的视图列表为空,这有点奇怪。

使用omnifaces 2.4,一切都运行正常(这就是为什么我没有添加我的向导的一些代码)。我检查了更改日志,并在使用MultiViews时注意到ExtensionlessURLs配置。不知道为什么这会影响我的问题,但我尝试了......没有成功。 我不知道会出现什么问题,所以也许你可以帮助我。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

在OmniFaces中,FacesViews无扩展名URL功能在版本2.5中进行了大修,以便支持所谓的MultiViews,因为您可以在this blog上阅读。

在此次大修期间,我在FacesViewsViewHandler处理<h:form>操作网址时出现了向后兼容性错误,以便包含MultiViews功能的虚拟文件夹。查询字符串参数已从原始操作URL中删除,而不是添加回来。

@ConversationScoped依赖于cid操作网址中<h:form>操作网址中的/context/page?cid=1请求参数。因此变为/context/page,因此在回发中不会保留对话。

我将在下一个OmniFaces版本中修复此问题,现在您可以通过将以下上下文参数添加到web.xml来恢复所需的行为。

<context-param>
    <!-- Workaround for disappearing @ConversationScoped ?cid= parameter -->
    <!-- This can be removed in next OmniFaces version after 2.6 -->
    <param-name>org.omnifaces.FACES_VIEWS_VIEW_HANDLER_MODE</param-name>
    <param-value>BUILD_WITH_PARENT_QUERY_PARAMETERS</param-value>
</context-param>

此参数触发一种不同的构建URL的方式,从而明确保留原始操作URL中的整个查询字符串。