2015-04-27 35 views
0

Iam試圖從ManagedBeanUtil類中獲取SessionScoped managedBean的對象,但是所有iam都是null。在ExternalContext中訪問@SessionScoped @ManagedBean類getSessionMap()返回null

這裏是我的代碼: -

package com.beas.ui.manager; 
@ManagedBean(name = "sessionManager") 
@SessionScoped 
public class SessionManager implements Serializable { 
private static final long serialVersionUID = -3064514740080155761L; 

//.. 
} 

public class ManagedBeanUtil { 

public static SessionManager getSessionManager() { 

    return (SessionManager) FacesContext.getCurrentInstance() 
      .getExternalContext().getSessionMap().get("sessionManager"); // returns null 
} 
} 

我不沒有什麼IAM做錯了。任何人都可以爲此提供合適的解決方案?

+1

你爲什麼要以這樣的方式,而不是注射進入豆? – erencan

+0

訪問sessionManager @erencan的方式有問題。 – Subodh

回答

5

當您以「原始」方式訪問它時,當JSF尚未(自動)創建該bean時,它將返回null

如果你想確保JSF自動創建bean,那麼你應該是作爲一個EL表達式通過等Application#evaluateExpressionGet()評估它訪問它:

public static SessionManager getSessionManager() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return (SessionManager) context.getApplication().evaluateExpressionGet(context, "#{sessionManager}", SessionManager.class); 
} 

然而,規範(更聲明式)的方式是將其作爲@ManagedProperty注入到目標bean中(其作用與上面基本相同)。

@ManagedBean 
@RequestScoped 
public class SomeBean { 

    @ManagedProperty("#{sessionManager}") 
    private SessionManager sessionManager; // +setter 
} 

CDI @Named + @Inject使得通過不需要setter和註釋值更乾淨。

@Named 
@RequestScoped 
public class SomeBean { 

    @Inject 
    private SessionManager sessionManager; 
} 
@Named 
@SessionScoped 
public class SessionManager implements Serializable { 

} 
+0

對不起,這麼晚纔回復,但會話範圍中聲明瞭sessionManager託管bean。所以我們可以通過getSessionMap()方法訪問managedBean。它實際上適用於我,但不是這次:( – Subodh

+0

嗯?你是否閱讀並理解了答案?第一句已經解釋了什麼時候它會返回'null',然後答案顯示你怎樣才能獲得它。你的意思是回覆其他人的評論? – BalusC

+0

是啊讀過你的答案,但我擔心的是爲什麼bean還沒有被創建,它應該是什麼?使用getSessionMap()有什麼錯誤 – Subodh

相關問題