我对新的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: {}
我做错了什么?!
答案 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以更全面地了解该主题...