我如何使用@ConversationScoped

Ala*_*ect 12 cdi jsf-2 glassfish-3

我正在编写一个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";
}
Run Code Online (Sandbox Code Playgroud)

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

第二次更新:我在这里找到关于CDI的@ConversationScoped的非常好的讨论.

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

Dar*_*Whi 3

使用MyFaces CODI的 (CDI) 范围就更简单了。他们有更好的@ConversationScoped,您会喜欢@ViewAccessScoped 来实现您正在尝试的功能。