1

我对新的 JEE6 CDI 规范有疑问,特别是 @Inject 与@Named似乎已经取代了 jsf 特定@ManagedBean(用于注册资源)和@ManagedProperty(用于注入)注释的注释结合使用。

假设您有一个 bean 类“ User”注释@ManagedBean @SessionScoped,并且该类的一个对象被注入到任何 bean 中,@ManagedProperty然后当这个对象被创建和注入时,它也被放入会话中,我可以访问会话(例如在过滤器中)并检索对象使用:

User user = (User)((HttpServletRequest) request).getSession().getAttribute("user");

因此,如果我尝试使用相同的逻辑(在 glassfish 3.1.2 中)@Named @SessionScoped,然后@Inject我可以确认会话中没有这种类型的对象User,但这是我在会话中找到的:

属性名称:org.jboss.weld.context.conversation.ConversationIdGenerator    
属性值:org.jboss.weld.context.conversation.ConversationIdGenerator@b374765

属性名称:org.jboss.weld.context.ConversationContext.conversations            
属性值:{}

我在哪里做错了?!

4

1 回答 1

0

如果使用 注释 bean @SessionScoped,则基本上是将其生命周期绑定到 HttpSession。这并不意味着 bean 被物理注入到会话对象中。

假设您有一个带有 @ManagedBean @SessionScoped 注释的 bean 类“用户”,并且使用 @ManagedProperty 将此类的对象注入到任何 bean 中,那么当创建并注入该对象时,它也被放入会话中,我可以访问会话(对于过滤器中的示例)并使用以下方法检索对象:

非常重要:不要混合 JSF 和 CDI 注释。在 JSF 模板中制作您想要访问的所有 bean @Named,并使用 CDI@Inject@...Scoped,这就足够了。

要回答您的问题:

@SessionScoped
public class User { ... }


@RequestScoped
public class SomeController { 

@Inject
User user

...
}

这将在会话开始时创建并在实例化时User将其注入(在此示例中使用新请求)。SomeControllerSomeController

查看Weld 文档以更完整地了解该主题...

于 2012-04-18T13:43:21.190 回答