2013-06-11 81 views
1

我想使用@ManagedProperty訪問另一個bean中的@SessionScoped bean的屬性。總之,我想訪問secondBean中firstBean的name屬性。無法訪問另一個受管bean的託管bean的屬性

@ManagedBean 
@SessionScoped 
public class FirstBean implements Serializable{ 
    private String name; 
    //...other attributes 
    //...constructor 
    public String getSelectedModel() { 
     return selectedModel; 
    } 

    public void setSelectedModel(String selectedModel) { 
     this.selectedModel = selectedModel; 
    } 
    //other getters&setters 
} 

而第二個bean:

@ManagedBean 
@SessionScoped 
public class SecondBean implements Serializable{ 

@ManagedProperty(value="#{firstBean}") 
private FirstBean firstBean 

public SecondBean() { 
    System.out.println(firstBean.getName()); 
} 
public IndexBean getFirstBean() { 
    return firstBean; 
} 

public void setFirstBean(FirstBean firstBean) { 
    this.firstBean = firstBean; 
} 

當我運行此,我總是在第二個bean,這似乎意味着,我需要創建的firstBean一個新實例的構造函數得到NullPointerExceptionSystem.out.println(firstBean.getName());

但奇怪的是,當我註釋掉這一行時,我可以這樣做,沒有錯誤,這意味着firstBean實際上是secondBean的一個屬性。

<h:outputText value="#{secondBean.firstBean.name}" /> 

這裏有什麼問題?

回答

2

無法在構造函數中訪問注入的依賴項。你基本上預計,Java是能夠做這樣的事:

SecondBean secondBean; // Declare. 
secondBean.firstBean = new FirstBean(); // Inject. 
secondBean = new SecondBean(); // Construct. 

這是絕對不可能的,如果該實例尚未構建設置一個實例變量。相反,它的工作原理如下:

SecondBean secondBean; // Declare. 
secondBean = new SecondBean(); // Construct. 
secondBean.firstBean = new FirstBean(); // Inject. 

然後,爲了執行基於依賴注入業務操作,使用帶有@PostConstruct註釋的方法。它將在構建依賴注入之後直接由依賴注入管理器調用。

因此,只需更換

public SecondBean() { 
    System.out.println(firstBean.getName()); 
} 

通過

@PostConstruct 
public void init() { // Note: method name is fully to your choice. 
    System.out.println(firstBean.getName()); 
}