NullpointerException绑定不起作用的JSF托管bean

时间:2010-03-15 15:38:57

标签: jsf

我创建了一个简单的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?请帮帮我。

2 个答案:

答案 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属性。