我如何使用@ConversationScoped

时间:2011-08-15 04:25:50

标签: jsf-2 glassfish-3 cdi

我正在编写一个JSF 2.0应用程序,我想使用CDI注释而不是“等效”JSF注释。换句话说,@ Model或@Named代替@ManagedBean,@ Inject代替@ManagedProperty。

我唯一无法工作的是@ViewScoped,它是AJAX组件所必需的。唯一可靠的解决方法是使用@SessionScoped,这不是一个好习惯。

正确的做法是什么?在我搜索的时候,我感到更加困惑。

这是在GlassFish 3.1.1上,据我所知,其中有Weld 1.1.0。

更新:这个问题的原始形式说我无法让@ConversationScoped工作。从那以后我发现了我的错误,我确实让它像这样工作:

@Model
@ConversationScoped
public class Abean implements Serializable {

@Inject Conversation conversation;

// stuff omitted for brevity

public String getSomething() {
    if (conversation.isTransient()) conversation.begin();
    return "something";
}

这似乎可以解决问题。但是现在我的问题已经改变了。你应该在哪里调用conversation.end()?我是否必须编写过滤器来检测用户何时离开页面?或者,如果它被单独留下,那么 Abean 实例何时被取消引用?

第二次更新:对CDI的@ConversationScoped的一次非常好的讨论我找到here.

我仍然遇到如何调用conversation.end()的问题。我的bean为通过AJAX更新的数据表浏览器提供有状态的支持,并且调用end()的最佳位置是用户导航离开页面。但是,如果没有编写过滤器来监控页面,我实际上并没有看到任何方法。欢迎任何关于“最佳实践”的建议。

2 个答案:

答案 0 :(得分:3)

使用MyFaces CODI的(CDI)范围更简单。他们有一个更好的@ConversationScoped,你会喜欢你正在尝试的@ViewAccessScoped。

答案 1 :(得分:1)

更新:JSF 2.2(jsr 344,在草案初稿中)正在为此添加@FlowScoped CDI范围。 More info...