小故事:我有一個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)
(我在一個階段偵聽器中執行此操作(出於測試目的,但僅僅因爲它已經存在)而創建會話),那麼一切都按預期工作。
您的UI如何構建? – 2013-05-10 14:55:18
@JohnAment:嗯,這是JSF 2(Mojarra)。我正在測試的特定頁面非常簡單。它來源於一個模板,只是彙集了幾個facelets。使用請求作用域bean的EL表達式在實際頁面中,而不是在facelets中,並且只是訪問bean中的文本屬性(它使用用戶上下文bean來獲取用戶角色)。 – 2013-05-10 14:59:22
好的,很好。對不起,CDI實施和容器怎麼樣?如果你使用的是tomcat,你通過servlet使用CDI嗎? – 2013-05-10 15:07:16