2012-04-05 41 views
3

我想一個sessionscoped豆的價值注入一個viewscoped豆,但它一直返回null,這裏有一個片段:@ManagedProperty不能反映變化和不斷返回null

import javax.faces.application.FacesMessage; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.context.FacesContext; 

//Class for managing the current logged-in user 
@ManagedBean(name="user") 
@SessionScoped 
public class User implements Serializable{ 

private String userName; 

public void setUserName(String userName) { 
    this.userName = userName; 
} 
public String getUserName() { 
    return this.userName; 
} 

而且它在使用:

@ManagedBean(name="databrowser") 
@ViewScoped 
public class dataBrowser implements Serializable { 

private List<UploadData> dataItems; 
private SelectItem[] dataTypeOptions, qualityOptions, accessOptions; 
private UploadData selectedData; 
private String filelocation; 

@ManagedProperty(value="#{user.userName}") 
private String userName; 

public String getUserName() { 
    return this.userName; 
} 

dataBrowser用來填充Primefaces數據表,當它被稱爲用戶名爲空,我不知道爲什麼。

+1

你有'userName'二傳手?你需要一個才能進行注射工作。 – 2012-04-05 07:59:17

+1

...你還需要@ViewScoped bean中的setter。 – 2012-04-05 08:09:39

+1

這將拋出一個異常,而不是返回'null'。 – BalusC 2012-04-05 13:24:24

回答

2

最近我也有注入嵌套託管bean屬性@ManagedProperties的問題。一旦注入它永遠不會改變。我通過在getter中評估EL而不是注入來做了一個解決方法。

試一下:

public String getUserName() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return (String) context.getApplication().evaluateExpressionGet(context,"#{user.userName}", String.class); 
} 

您也可以嘗試注入整個user豆和吸氣從中獲得userName場。

0

與所有制定者/到位干將,我有同樣的問題(參考用戶),因爲缺少用戶類空構造。

在您所提供的示例中,dataBrowser和用戶豆類構建表,所以引用#{dataBrowser.userName}應該已經發現之前被實例化的userName @ManagedProperty正確注射(並非@PostConstruct問題)。

0

我剛剛遇到同樣的問題,偶然發現它不工作,如果我嘗試使用firefox(實際上在linux下icedove),但工作正常,如果我嘗試使用eclipse內置瀏覽器。

即使如此,這對我來說沒有任何意義,您是否嘗試過使用不同的瀏覽器?


michal777的回答非常好。我把它擴展到了此:

@ManagedProperty("#{nameBean}") 
private NameBean nameBean; 
public NameBean getNameBean() { return nameBean; } 
public void setNameBean(NameBean nameBean) { this.nameBean = nameBean; } 

public NameBean getNameBean_Workaround() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return (NameBean) context.getApplication().evaluateExpressionGet(context,"#{nameBean}", NameBean.class); 
} 

,稍後:現在

if (nameBean != null) { 
     nameBean.setName("achsooo"); 
    } 
    else { 
     getNameBean_Workaround().setName("achsooo2222"); 
    } 

,在Eclipse瀏覽器 「achsooo」 獲取設置,並在是icedove 「achsooo2222」 被設定。

0

#{user.userName}被JSF解釋爲getUser().getUserName()

因此,最好是有一個User@ManagedProperty,其getter/setter方法getUser/setUser。有了這個,你可以通過#{user.userName}訪問用戶的名字。

0

我有這個問題,問題實際上是雙重的。 (還要注意@ManagedProperty將只能在@ManagedBean類中工作,並且該@ManagedProperty類具有相同或更小的作用域(應用程序,會話,視圖,請求等)。)這是我如何固定它:


問題1: JSF是愚蠢和不abstract班妥善處理@ManagedProperty注射。

解決方案:

  1. 讓每一個使用@ManagedProperty@ManagedBean進行註釋。
  2. 使每個abstract類使用該屬性不被註釋與@ManagedProperty而只提供抽象的getter和setter方法,非抽象類將各自覆蓋。
  3. 使用abstract類的getter方法代替abstract類中的@ManagedProperty本身。

問題2: JSF是愚蠢的,不會不被JSF創建@ManagedBean班妥善處理@ManagedProperty注射(即你自己使用new創建這些類)。

解決方案:

  • 讓JSF創建使用@ManagedProperty類。
  • 使用下面的代碼:

MyClass example = Utils.getELValue("EL Expression Goes Here", MyClass.class); 

public static <T> T getELValue(final String elName, final Class<T> clazz) { 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    return (T) fc.getApplication().getELResolver().getValue(fc.getELContext(), null, elName); 

    // Potential (untested) alternative: 
    // ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().getAttribute("") 
}