jsf-2 - 我如何使用@ConversationScoped

标签 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() 的最佳位置是用户离开页面时。然而,如果没有编写过滤器来监控页面,我真的看不出有任何方法可以做到这一点。欢迎提出“最佳实践”的任何建议。

最佳答案

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

关于jsf-2 - 我如何使用@ConversationScoped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7061709/

相关文章:

jsf-2 - 将 UTF-8 字符串传递给 f :viewParam in JSF

java - Spring Context 是否具有相当于 Java CDI 的 @Inject @Any

java - 使用来自 src/test/META-INF/beans.xml 的替代生产者进行 Weld

java - 使用 Seam、RichFaces 和 PopupPanel 传递参数

java - 异常 java.lang.ClassCastException

ajax - JSF 复合组件 <f :ajax> contains an unknown id - cannot locate it in the context of the component

jsf - 使用命令按钮的 Ajax

glassfish - 在 GlassFish 上自动启动 JavaDB (Derby)

java - Servlet + 注入(inject) - 多线程问题

java - GlassFish v3 上的 Wicket 口