2011-11-09 83 views
2

我有一個容器認證後,所儲存的登錄數據如下託管bean:@ManagedProperty對象爲空

@ManagedBean(name = "authenticatedUserController") 
@SessionScoped 
public class AuthenticatedUserController implements Serializable { 

@EJB 
private jpa.UtentiportaleFacade ejbFacade; 

    public Utentiportale getAuthenticatedUser() { 
    if (AuthenticatedUser == null) { 
     Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal(); 
     if (principal != null) { 
      AuthenticatedUser = ejbFacade.findByLogin(principal.getName()).get(0); 
     } 
    } 
    return AuthenticatedUser; 
} 

getAuthenticatedUser就是所謂的每一頁,因爲我在Facelets把用戶名模板上右上方。 在PermessimerceController,另一managedbean,我需要訪問的登錄數據,所以很容易和快速地注入上述會話範圍控制器:

@ManagedProperty(value = "#{authenticatedUserController}") 
private AuthenticatedUserController authenticatedUserController; 

我經歷了以下幾個問題:試圖訪問鏈接到PermessimerceController頁面沒有經過身份驗證,我被重定向到登錄頁面(這是好的),但之後,我得到一個空指針異常,因爲authenticatedUserController在PermessimerceController內注入時爲空。 有問題的頁面同時使用PermessimerceController和AuthenticatedUserController,所以我應該猜測出於某種原因,PermessimerceController是在AuthenticatedUserController之前創建的。你能提出一個簡單的方法來解決這個問題嗎? 或者,我可以如何將登錄數據存儲在易於訪問的地方?

感謝 菲利波

我嘗試編輯這篇文章,希望能澄清更好,我有問題,找到有用的答案。 使用facelets模板我通過AuthenticatedUserController的屬性顯示用戶登錄名。剩下的內容被鏈接到Permessimer控制器,它需要關於用戶過濾數據的一些信息。 @ManagedBean註釋是實現這一點的簡單方法。不幸的是,如果用戶訪問該頁面而未經過認證,則注入的AuthenticatedUserController爲空。所以看起來PermessimerceController是在AuthenticatedUserController之前創建的,我不知道爲什麼。有沒有一種技巧可以用來確保AuthenticatedUserController是之前創建的?

+0

你有干將和'PermessimerceController'中的ManagedProperty的setter? –

+0

@Matt:在訪問它時會導致像'ManagedBeanCreationException'這樣的'FacesException',而不是NPE。 – BalusC

+0

BaluC是對的,我有那個ManagedProperty的setter。 – Filippo

回答

2

你顯然訪問它在bean的構造函數:

@ManagedProperty("#{authenticatedUserController}") 
private AuthenticatedUserController authenticatedUserController; 

public PermessimerceController() { 
    authenticatedUserController.getAuthenticatedUser(); // Fail! 
} 

這的確不是這樣的。這個bean構造依賴注入之前(想想吧,怎麼回事就依賴注入經理注入了嗎?)

最早的接入點是@PostConstruct方法:

@ManagedProperty("#{authenticatedUserController}") 
private AuthenticatedUserController authenticatedUserController; 

@PostConstruct 
public void init() { 
    authenticatedUserController.getAuthenticatedUser(); // Success! 
} 
+0

你的建議是我已經完成的。如果錯誤是在構造函數中使用ManagedProperty,它總是會失敗。相反,只有在我未通過身份驗證時嘗試直接訪問該頁面(使用其唯一網址),我纔會收到空指針異常。如果我首先執行登錄,然後瀏覽菜單到該頁面,則ManagedProperty不爲null。看起來在創建兩個ManagedBean之間存在競爭,並且無法弄清楚爲什麼Permessimer控制器是在另一個之前創建的。 – Filippo

+0

在我的第一篇文章中,我談到了身份驗證。我忘了提及,如果我已經通過身份驗證,我可以訪問鏈接到PermessimerceController的頁面,而不會有任何問題。 – Filippo