Jsf 2 两次调用begin时JSF/CDI对话范围中出现错误

Jsf 2 两次调用begin时JSF/CDI对话范围中出现错误,jsf-2,cdi,conversation-scope,Jsf 2,Cdi,Conversation Scope,我使用的是CDI对话范围,当用户遵循正常场景时,它就可以了。但是,当用户未完成de“对话”时,我会出现以下错误: WELD-000214 Attempt to call begin() on a long-running conversation 显然,这是因为有两个调用begin方法而没有调用end方法 为了澄清这一点,我的设想是: 在第一页中,用户通过引用搜索产品 数字如果找到,我将调用对话。开始并导航到 产品详细信息页面 在该页面中,当用户按下保存按钮时 在这一点上,我称之为对话。结束

我使用的是CDI对话范围,当用户遵循正常场景时,它就可以了。但是,当用户未完成de“对话”时,我会出现以下错误:

WELD-000214 Attempt to call begin() on a long-running conversation
显然,这是因为有两个调用begin方法而没有调用end方法

为了澄清这一点,我的设想是:

  • 在第一页中,用户通过引用搜索产品 数字如果找到,我将调用对话。开始并导航到 产品详细信息页面
  • 在该页面中,当用户按下保存按钮时 在这一点上,我称之为对话。结束
问题是,当用户处于详细信息页面时(例如,单击菜单中的链接),因此不会调用end方法。当他们返回到搜索页面时,我得到一个错误,因为begin被再次调用

我认为,一个可能的解决方案可能是在用户存在第二个页面时调用end方法。但我不知道如何做到这一点

(我正在使用JSF2.1和Weld 1.1.6实现CDI)


提前感谢

这种行为是故意的。您可以轻松地检查对话。isTransient()以决定是否希望/需要使对话长期运行

如果调用begin(),并且当前对话已标记 在长时间运行时,将抛出一个IllegalStateException


()

这种行为是故意的。您可以轻松地检查对话。isTransient()以决定是否希望/需要使对话长期运行

如果调用begin(),并且当前对话已标记 在长时间运行时,将抛出一个IllegalStateException


()

始终首先开始对话使用isTransient()方法检查对话是否结束


始终使用isTransient()方法首先检查对话是否结束

public void beginConversation(){
    if (!conversation.isTransient()){
        conversation.end();
    }
    conversation.begin();
}