我如何使用@ConversationScoped

Posted

技术标签:

【中文标题】我如何使用@ConversationScoped【英文标题】:How Do I Use @ConversationScoped 【发布时间】:2011-10-27 01:32:04 【问题描述】:

我正在编写一个 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() 的最佳位置是用户离开页面时。但是没有编写过滤器来监视页面,我真的看不到任何这样做的方法。欢迎任何关于“最佳实践”的建议。

【问题讨论】:

当且仅当出于业务逻辑原因我想明确结束对话时,我才会调用conversation.end()。我对您的问题的“解决方案”是让超时结束对话。如果用户关闭选项卡,她将无法使用对话。这对我的应用程序来说没有问题 - 对于您的应用程序来说,这可能不是一个可接受的解决方案,对于性能问题,所以我也对真实答案感到好奇。 【参考方案1】:

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

【讨论】:

我会检查一下,但我希望保持 EE 规范。谢谢指点。 CDI 旨在创建和使用可移植的 CDI 扩展。就像您通常使用 JSF 的组件库一样,因为规范永远不会包含高级组件。 我刚刚开始阅读 CODI 文档。如果它做到了它所说的,我认为它不仅仅是可取的,它变得不可或缺!没有它,人们如何使用 JSF 2?谢谢@“Dar Whi”【参考方案2】:

更新:JSF 2.2(jsr 344,在早期草稿审查中)为此添加了@FlowScoped CDI 范围。 More info...

【讨论】:

也提到了与 CDI 兼容的@javax.faces.flow.ViewScoped。有些人可能会感兴趣。

以上是关于我如何使用@ConversationScoped的主要内容,如果未能解决你的问题,请参考以下文章

CDI @ConversationScoped 与 AJAX

对话范围是不是泄漏?

如何使用主题api绘制任务栏按钮,如图标

在 CRA 中获取捆绑包后如何保留我的隐藏字段(如 api 密钥)

如何使用额外的选项(如全景)实现相机功能?

如何正确使用 % include % 标签在 django 中呈现模板(如部分)?