Jsf 无法从另一个托管bean访问托管bean的属性

Jsf 无法从另一个托管bean访问托管bean的属性,jsf,Jsf,我想使用@ManagedProperty访问另一个bean中的@SessionScopedbean的属性。简而言之,我想访问secondBean中firstBean的name属性 @ManagedBean @SessionScoped public class FirstBean implements Serializable{ private String name; //...other attributes //...constructor public S

我想使用
@ManagedProperty
访问另一个bean中的
@SessionScoped
bean的属性。简而言之,我想访问secondBean中firstBean的name属性

@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
}
<h:outputText value="#{secondBean.firstBean.name}" />
第二个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;
}
当我运行它时,我总是在
System.out.println(firstBean.getName())上获得
NullPointerException
在第二个bean的构造函数中,这似乎意味着我需要创建
firstBean
的新实例

但奇怪的是,当我注释掉这一行时,我可以这样做而没有错误,这意味着firstBean实际上是secondBean的一个属性

@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
}
<h:outputText value="#{secondBean.firstBean.name}" />


这里有什么问题?

不可能访问构造函数中的注入依赖项。您基本上期望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());
}