2013-05-10 44 views
3

小故事:我有一個CDI @SessionScoped豆(註冊號javax.enterprise.context而不是javax.faces),調用UserContextBean。我想在創建HTTP會話時真正做一些事情。CDI中的PostConstruct SessionScoped託管的豆子

所以自然我認爲@PostConstruct會做的伎倆:構建此bean的實例時只調用一次。 然而,按照文檔here,他們說,PostConstruct方法被稱爲:

當託管bean被注入到一個組件,CDI調用 方法已發生的所有注射後,所有初始化 有後被稱爲。

我曾經假設每個會話都會調用一次post構造方法。但是,實踐與文檔一致。這個bean被注入到一個@RequestScoped bean(也是CDI)中,該bean用作JSF頁面的後臺bean,對於每個請求,PostConstruct方法都被稱爲

我意識到(現在)這是行爲。但是有沒有其他方法可以在每個會話初始化時執行一次?

一些代碼,雖然不是很相關:

@Named(UserContextBean.BEAN_NAME) 
@SessionScoped 
public class UserContextBean implements Serializable { 

... 

    @PostConstruct 
    private void createSession() { 
     System.out.println("UserContext created."); 
    } 
} 

請求範圍的bean,我注入這一點:

public abstract class WebPageDataProvider extends AbstractViewDataProvider { 

    @Inject 
    private UserContextBean userContext; 

我也在想使用一個HttpSessionListener並初始化會話bean,但它已經聽起來很亂。

編輯

現在的HTTP會話甚至沒有創建只注意到。如果我通過調用getSession(true)(我在一個階段偵聽器中執行此操作(出於測試目的,但僅僅因爲它已經存在)而創建會話),那麼一切都按預期工作。

+0

您的UI如何構建? – 2013-05-10 14:55:18

+0

@JohnAment:嗯,這是JSF 2(Mojarra)。我正在測試的特定頁面非常簡單。它來源於一個模板,只是彙集了幾個facelets。使用請求作用域bean的EL表達式在實際頁面中,而不是在facelets中,並且只是訪問bean中的文本屬性(它使用用戶上下文bean來獲取用戶角色)。 – 2013-05-10 14:59:22

+0

好的,很好。對不起,CDI實施和容器怎麼樣?如果你使用的是tomcat,你通過servlet使用CDI嗎? – 2013-05-10 15:07:16

回答

0

HttpSessionListener是您最好的選擇。你可以做的是將SessionScoped組件注入偵聽器並在那裏設置值。