JSF/CDI:在页面呈现后结束对话?
我遇到过这样一种情况:我使用JSF2.2呈现了一个多步骤向导,并部署在Wildfly 10/JBoss EAP上。我们的向导存在于CDIJSF/CDI:在页面呈现后结束对话?,jsf,jakarta-ee,jsf-2,cdi,conversation-scope,Jsf,Jakarta Ee,Jsf 2,Cdi,Conversation Scope,我遇到过这样一种情况:我使用JSF2.2呈现了一个多步骤向导,并部署在Wildfly 10/JBoss EAP上。我们的向导存在于CDI对话中,用于维护所有页面的状态。向导的最后一步完成后,会将一条记录保存到数据库中,我会调用conversation.end()来结束工作流。我希望显示对话范围内存在的值,以向用户指示进程已完成。但是,当我结束对话时,该值显然会消失,因为它是在对话范围中设置的 有没有办法告诉CDI在最后一页完成渲染后结束我的对话?是否有更好的方法来管理对话?据我所知,没有任何方法
对话中,用于维护所有页面的状态。向导的最后一步完成后,会将一条记录保存到数据库中,我会调用conversation.end()
来结束工作流。我希望显示对话范围内存在的值,以向用户指示进程已完成。但是,当我结束对话
时,该值显然会消失,因为它是在对话
范围中设置的
有没有办法告诉CDI在最后一页完成渲染后结束我的对话
?是否有更好的方法来管理对话
?据我所知,没有任何方法可以像您所希望的那样操纵对话范围。除非在重定向用户并显示值后可以调用conversation.end()
。但这将不再适用于向导的生命周期
但一个相对简单的解决方法是使用任何比对话更广泛的范围,并将价值存储在其中。为了坚持使用纯CDI,我会选择@SessionScoped
(毕竟,会话是在会话中进行的)
在调用conversation.end()之前不久,将所需的值存储到会话范围的bean变量中,并从那里显示它。我对此非常生疏,但您不能只保留要在@SessionScoped
或@ViewScoped
注释bean?或DeltaSpike的@ViewScoped
中显示的值吗?我会选择Delta Spike中的ViewScoped。。。它是“纯cdi”,但是一个扩展。不是自定义框架,但需要引入DeltaSpike依赖项才能获得该框架。很多人都反对添加任何额外的内容,甚至项目经理/领导都禁止这样做。所以我试着用最简单的方式来陈述。排序或者确实发生了很多。。。。但是在我(有时并非如此)的拙见中,任何反对添加好的现有扩展(如Delta Spike或OmniFaces(甚至PrimeFaces))并要求编写自定义代码的项目负责人,或者使用相对复杂的对话结构(viewaccesscoped非常适合)的项目负责人都应该被解雇;-)(无论如何,我反对明确的项目负责人或“架构师”。团队应该是项目负责人和/或架构师。)