1

我正在使用 CDI 对话范围,当用户遵循正常情况时就可以了。但是,当用户未完成“对话”时,我收到此错误:

WELD-000214 Attempt to call begin() on a long-running conversation

显然,是因为有 2 次调用begin方法而没有调用end方法。

为了澄清这一点,这是我的场景:

  • 在第一页中,用户通过参考编号搜索产品。如果找到了,我会调用conversation.begin并导航到产品详细信息页面。
  • 在此页面中,当用户按下保存按钮时,此时我调用了conversation.end

问题是在用户离开的详细信息页面(例如,单击菜单中的链接)时,不会调用end方法。当他们返回搜索页面时,我收到错误,因为再次调用了begin 。

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

(我正在使用 JSF 2.1 和 CDI 的 Weld 1.1.6 实现)

提前致谢

4

2 回答 2

3

这种行为是故意的。您可以轻松检查conversation.isTransient()以决定是否要/需要进行长时间的对话。

如果 begin() 被调用,并且当前会话已被标记为长时间运行,则会引发 IllegalStateException。

请参阅此处的规范

于 2012-04-24T18:08:49.633 回答
2

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

public void beginConversation(){
    if (!conversation.isTransient()){
        conversation.end();
    }
    conversation.begin();
}
于 2016-06-17T10:20:08.333 回答