2013-06-11 82 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()); 
}