2012-04-16 47 views
1

我对新的JEE6 CDI规范有疑问,特别是@Inject和@Named注释的使用似乎已经替换了jsf特定的@ManagedBean(用于注册资源)和@ManagedProperty(用于注射)注释。从会话范围检索@Named托管bean

假设你有一个bean类“User”注明@ManagedBean @SessionScoped和这个类的一个对象是使用@ManagedProperty那么当这个对象被创建在任何豆注入和注入它也放在会议,我可以访问会话(使用实施例中的过滤器)和检索对象:

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: [email protected]765 

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

我在哪里做错了?!

回答

0

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

假设你有一个bean类“用户”注解@ManagedBean @SessionScoped和这个类的一个对象使用@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以获得该主题的更完整的开始...

相关问题