我想使用@SessionScoped
访问另一个bean中的@ManagedProperty
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的构造函数中的NullPointerException
上获得System.out.println(firstBean.getName());
,这似乎意味着我需要创建一个firstBean
的新实例。
但奇怪的是,当我注释掉这一行时,我可以做这样的事情而没有错误,这意味着firstBean实际上是secondBean的属性。
<h:outputText value="#{secondBean.firstBean.name}" />
这里有什么问题?
答案 0 :(得分: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());
}