我正在编写一个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()的最佳位置是用户导航离开页面。但是,如果没有编写过滤器来监控页面,我实际上并没有看到任何方法。欢迎任何关于“最佳实践”的建议。
答案 0 :(得分:3)
使用MyFaces CODI的(CDI)范围更简单。他们有一个更好的@ConversationScoped,你会喜欢你正在尝试的@ViewAccessScoped。
答案 1 :(得分:1)
更新:JSF 2.2(jsr 344,在草案初稿中)正在为此添加@FlowScoped CDI范围。 More info...