2012-04-24 19 views
1

我正在使用CDI对话范围,并且在用户遵循正常场景时没有问题。但是,当用户没有完成去“谈话”我得到这个错误:当开始被调用两次时,JSF/CDI对话范围中的错误

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

显然,是因为有2个呼叫到开始方法,无需调用年底方法。

要澄清,这是我的情景:

  • 在第一页中,用户在搜索产品由参考 数。如果发现我打电话给对话。开头并导航到 产品详细信息页面。
  • 在这个页面,当用户按压保存按钮 在这一点上,我叫conversation.end

的问题是在明细页面,用户离开了是时候(例如,点击菜单中的链接),所以年底方法不叫。当他们返回到搜索页面时,我得到错误,因为开始被再次调用。

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

(我使用的是JSF 2.1,和焊接1.1.6执行CDI)的提前

回答

3

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

If begin() is called, and the current conversation is already marked long-running, an IllegalStateException is thrown.

see the spec here

1

始终开始谈话第一检查是使用isTransient()方法谈话结束。

public void beginConversation(){ 
    if (!conversation.isTransient()){ 
     conversation.end(); 
    } 
    conversation.begin(); 
} 
相关问题