我创建了一个简单的HtmlInputText
<h:inputText binding="#{IndexBean.objUIInput}" />
然后在我的托管bean中,它是: -
private UIInput objUIInput;
public UIInput getObjUIInput() {
objUIInput.setValue("laala");
return objUIInput;
}
public void setObjUIInput(UIInput objUIInput) {
System.out.println("Set!!");
this.objUIInput = objUIInput;
}
但我总是得到NullpointerException。我需要在JSF页面上做任何额外的事情吗?就像我们做jsp:usebean setproperty?请帮帮我。
答案 0 :(得分:5)
每当您想要在显示之前更改组件的默认状态/行为时,您需要自己实例化。即宣言期间:
private UIInput objUIInput = new HtmlInputText();
或在施工期间:
public Bean() {
this.objUIInput = new HtmlInputText();
}
或者,正如Bozho建议的那样,使用@PostConstruct
:
@PostConstruct
public void init() {
this.objUIInput = new HtmlInputText();
}
(将在构造bean以及所有托管属性的初始化/设置之后发生)。
事实上,你最好不要在getter / setter中做任何业务逻辑。它们将用于访问bean属性,并且可以在bean的生命周期内多次调用它们。
根据评论,您也可以将UIInput#setValue()
调用移至setter方法。在预先创建组件之后,JSF将直接调用它。
public void setObjUIInput(UIInput objUIInput) {
this.objUIInput = objUIInput;
this.objUIInput.setValue("laala");
}
答案 1 :(得分:1)
当你绑定一个组件时,getter和setter应该很简单 - 只有get / set - 里面没有逻辑。
也许JSF生命周期调用getter来检查它是否需要实例化组件,而getter最初会抛出一个NPE。
从getter中删除所有逻辑,或者至少添加一个空检查。
实际上,我建议不要使用绑定。
如果要为组件设置初始值,请使用带@PostConstruct
注释的方法并在其中指定值,然后使用value
属性。