从会话范围检索@Named托管bean

时间:2012-04-16 23:07:17

标签: java jsf java-ee-6 cdi

我对新的JEE6 CDI规范提出了一个问题,特别是将@Inject与@Named注释一起使用,这些注释似乎已经替换了jsf特定的@ManagedBean(用于注册资源)和@ManagedProperty(注射用)注释。

假设你有一个bean类“User”注释@ManagedBean @SessionScoped,并且使用@ManagedProperty在任何bean中注入了这个类的对象,那么当创建并注入此对象时,它也是放入会话,我可以访问会话(例如在过滤器中)并使用以下方法检索对象:

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

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

attribute_name:  org.jboss.weld.context.conversation.ConversationIdGenerator    
attribute_value:  org.jboss.weld.context.conversation.ConversationIdGenerator@b374765 

attribute_name:  org.jboss.weld.context.ConversationContext.conversations            
attribute_value:   {} 

我做错了什么?!

1 个答案:

答案 0 :(得分:0)

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

  

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

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

回答你的问题:

@SessionScoped
public class User { ... }


@RequestScoped
public class SomeController { 

@Inject
User user

...
}

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

查看Weld documentation以更全面地了解该主题...