Jsf 2 如何使用@ConversationScoped

Jsf 2 如何使用@ConversationScoped,jsf-2,glassfish-3,cdi,Jsf 2,Glassfish 3,Cdi,我正在编写一个JSF2.0应用程序,我希望使用CDI注释而不是“等效”的JSF注释。换句话说,@Model或@Named代替@ManagedBean,@Inject代替@ManagedProperty 我唯一无法使用的是@ViewScoped,这是AJAX组件所必需的。唯一可靠的解决方法是使用@SessionScoped,这不是一个好的实践 正确的做法是什么?虽然我搜索了很多,但我还是更加困惑 这是GlassFish 3.1.1上的内容,我知道其中包含Weld 1.1.0 更新:这个问题的原始形

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

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

正确的做法是什么?虽然我搜索了很多,但我还是更加困惑

这是GlassFish 3.1.1上的内容,我知道其中包含Weld 1.1.0

更新:这个问题的原始形式表示我无法让@ConversationScope工作。从那时起,我发现了我的错误,我确实让它像这样工作:

@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的@ConversationScope的非常好的讨论


我仍然有如何调用conversation.end()的问题。MyBean为通过AJAX更新的数据表浏览器提供有状态支持,调用end()的最佳位置是用户离开页面时。然而,除了编写一个过滤器来监视页面之外,我真的看不到任何方法可以做到这一点。欢迎任何关于“最佳实践”的建议。

这在(CDI)范围内更简单。他们有一个更好的@ConversationScope,您会喜欢您正在尝试的@ViewAccessScope。

更新:JSF 2.2(jsr 344,在早期草案审查中)正在为此添加一个@FlowScope CDI范围

如果且仅当出于业务逻辑原因希望显式结束对话时,我才会调用
conversation.end()
。我对你问题的“解决方案”是让暂停时间结束对话。如果用户关闭该选项卡,她将无法使用该对话。这对我的应用程序来说并没有问题——对于性能问题来说,这可能不是一个可接受的解决方案,所以我也很好奇真正的答案。我会检查一下,但我希望遵守EE规范。感谢指针。CDI旨在创建和使用便携式CDI扩展。这就像您通常使用JSF的组件库,因为该规范永远不会包含高级组件。如果它做到了它所说的,我认为这是非常可取的,它成为不可或缺的!如果没有它,人们如何使用JSF2?谢谢@“Dar Whi”,这里提到了CDI兼容@javax.faces.flow.ViewScoped。这可能会引起一些人的兴趣。