【问题标题】:JSF/CDI: End Conversation after page renders?JSF/CDI:页面呈现后结束对话?
【发布时间】:2017-12-17 10:01:19
【问题描述】:

我有一个使用 JSF 2.2 呈现并部署在 Wildfly 10/JBoss EAP 上的多步骤向导。我们的向导存在于 CDI Conversation 中,以维护所有页面的状态。向导的最后一步完成后,一条记录将保存到数据库中,我调用conversation.end() 结束工作流。我想显示一个存在于我的对话范围内的值,以向用户表明该过程已完成。但是,当我结束我的Conversation 时,该值显然会消失,因为它是在Conversation 范围内设置的。

有没有办法告诉 CDI 在最终页面完成渲染后结束我的Conversation?有没有更好的方法来处理Conversation的管理?

【问题讨论】:

  • 我对此很生疏,但你不能只保留你想在 @SessionScoped@ViewScoped 带注释的 bean 中显示的值吗?
  • 或者来自 DeltaSpike 的 @ViewAccessScoped

标签: jsf jakarta-ee jsf-2 cdi conversation-scope


【解决方案1】:

据我所知,没有办法随心所欲地操纵对话范围。除非您可以在重定向用户并显示值之后调用conversation.end()。但这不再适合向导的生命周期。

但一种相对简单的解决方法是使用任何比对话更有效的范围并将价值存储在那里。要坚持使用纯 CDI,我会选择 @SessionScoped(毕竟,对话是在会话中进行的)。

在您调用 conversation.end() 之前,将所需的值存储到会话范围的 bean 变量中并从那里显示它。

【讨论】:

  • 我会选择 Delta Spike 的 viewAccessScoped ......它是“纯 cdi”,但它是一个扩展。不是自定义框架
  • 是的,但是你需要引入 DeltaSpike 依赖来获得那个。很多人反对添加任何额外的东西,甚至被项目经理/领导禁止这样做。所以我只是试图陈述最小的方式。
  • 排序或确实发生了很多......但是......在我(有时不是这样)的拙见中,任何反对添加良好现有扩展的项目负责人像 Delta Spike 或 OmniFaces(甚至 PrimeFaces),并且需要编写自定义代码,或者使用相对复杂的对话结构,其中 viewaccesscoped 非常适合应该被解雇;-)(我反对明确的项目负责人或“建筑师” ' 无论如何。团队应该是项目负责人和/或架构师。)
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2012-12-08
  • 2012-12-24
  • 2012-02-10
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多