【问题标题】:Cant access property of managed bean from another managed bean无法从另一个托管 bean 访问托管 bean 的属性
【发布时间】:2013-06-11 16:01:02
【问题描述】:

我想使用@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
}

第二个豆子:

@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 的构造函数中的 System.out.println(firstBean.getName()); 上得到 NullPointerException,这似乎意味着我需要创建一个 firstBean 的新实例。

但奇怪的是,当我注释掉这一行时,我可以毫无错误地做这样的事情,这意味着 firstBean 实际上是 secondBean 的属性。

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

这里有什么问题?

【问题讨论】:

    标签: jsf


    【解决方案1】:

    无法在构造函数中访问注入的依赖项。你基本上期望 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());
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 2012-05-22
      • 2012-03-24
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2014-12-11
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多