2011-12-07 89 views
1

我從另一個請求Bean實例化請求Bean實例手動bean時不工作,豆註解像@ManagedProperty和@PostConstruct從另一個bean

new LoginManager(); 

但其標註有@ManagedProperty沒有按」財產只有在通過上述方式實例化的情況下,才能從詢問參考中獲得值。它只包含null,以後在代碼中導致NPE。 @PostConstruct也不會被調用。爲什麼如此&我該如何處理這個問題?

@ManagedBean(name = "loginManager") 
@RequestScoped 
public class LoginManager { 

    private String userid; 
    private String password; 

    @ManagedProperty(value="#{currentSession}") 
    private UserSessionManager userSession; 

} 

userSession無法從會話中使用讀取範圍的bean時這個bean實例化:new LoginManager();

但是我可以用FacesContext讀取值!

回答

4

您不應使用new運算符手動實例化(管理)bean。你應該讓JSF完成管理bean的工作,而是抓住JSF管理的(JSF實例化的)實例。

無論是在bean @ManagedProperty在你需要它:

@ManagedProperty("#{loginManager}") 
private LoginManager loginManager; 

或者通過調用EL編程(這是你的具體情況相當交界):

LoginManager loginManager = context.getApplication().evaluateExpressionGet(context, "#{loginManager}", LoginManager.class); 
// ... 

如果您在實例堅持並自己管理bean,你應該自己完成所有的依賴注入,也可以自己調用@PostConstruct,如果有的話,最後還要把bean放在你想要的範圍內。例如。

LoginManager loginManager = new LoginManager(); 
loginManager.setUserSession(userSession); 
// Now use reflection to find and invoke @PostConstruct method. 
// Finally store in the map which conforms the bean's scope. 
externalContext.getRequestMap().put("loginManager", loginManager); 

這個樣板正是JSF應該從你手中拿走的東西。利用它。

+0

完美!非常感謝!在這兩種方法(使用@ManagedProperty&evaluateExpressionGet')中,如果bean已經存在,它們會被檢索到嗎?所以我不需要甚至檢查這個bean是否已經被實例化並且我可以直接使用,對吧? –

+2

這是正確的。如果JSF在範圍中不存在,JSF將只創建它,否則它只會返回現有的實例。 – BalusC

相關問題