2012-04-16 42 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以獲得該主題的更完整的開始...

相關問題