1

我正在尝试从数组中创建下拉菜单,但我总是得到 nullPointerException/。我尝试了一切: -on setter 我用数据创建数组 -on getter 如果数组为 null 我调用 setter -on getter 我试图创建新的数组对象并用 setter 填充它 -尝试用 ajax 执行下拉菜单,然后填充它和

这些都没有:/我今天必须这样做,所以现在我只是硬编码下拉列表,但我想知道我在哪里犯了错误:/

这是页面的下拉代码:

<h:selectOneMenu id="dataRejestracjiMiesiac" value="#{searchBean.dataRejMiesiac}">
<f:selectItems value="#{searchBean.listaMiesiecy}" var="m" itemLabel="#{m.miesiac}" itemValue="#{m.miesiacID}"/>
</h:selectOneMenu>

这里是我的 bean 中的代码:

protected Miesiac[] listaMiesiecy = new Miesiac[12];

public void setListaMiesiecy() {
        this.listaMiesiecy[0] = new Miesiac(1, "Styczen", 31);
        this.listaMiesiecy[1] = new Miesiac(2, "Luty", 28);
        this.listaMiesiecy[2] = new Miesiac(3, "Marzec", 31);
        this.listaMiesiecy[3] = new Miesiac(4, "Kwiecień", 30);
        this.listaMiesiecy[4] = new Miesiac(5, "Maj", 31);
        this.listaMiesiecy[5] = new Miesiac(6, "Czerwiec", 30);
        this.listaMiesiecy[6] = new Miesiac(7, "Lipiec", 31);
        this.listaMiesiecy[7] = new Miesiac(8, "Sierpień", 31);
        this.listaMiesiecy[8] = new Miesiac(9, "Wrzesień", 30);
        this.listaMiesiecy[9] = new Miesiac(10, "Październik", 31);
        this.listaMiesiecy[10] = new Miesiac(11, "Listopad", 30);
        this.listaMiesiecy[11] = new Miesiac(12, "Grudzień", 31);
    }
public Miesiac[] getListaMiesiecy(){
    listaMiesiecy = new Miesiac[12];
    return this.listaMiesiecy;
}

我从数组的下一个下拉列表中遇到同样的问题 - 几天,这是几个月

提前感谢您的帮助:)

4

1 回答 1

3

您不应该在 setter 方法中填充列表。事实上,对于非输入组件,setter 方法永远不会被调用。<f:selectItems>仅输出并且从不调用其设置器。仅当 JSF 需要使用提交的值更新模型值时,才会为输入组件调用 setter。例如<h:selectOneMenu>自身的价值。

相反,您应该在构造函数中预先填充模型,或者更好的@PostConstruct是,在 bean 的注释方法中。

例如

public class Bean {

    private Miesiac[] listaMiesiecy;

    @PostConstruct
    public void init() {
        this.listaMiesiecy = new Miesiac[12];
        this.listaMiesiecy[0] = new Miesiac(1, "Styczen", 31);
        this.listaMiesiecy[1] = new Miesiac(2, "Luty", 28);
        this.listaMiesiecy[2] = new Miesiac(3, "Marzec", 31);
        this.listaMiesiecy[3] = new Miesiac(4, "Kwiecień", 30);
        this.listaMiesiecy[4] = new Miesiac(5, "Maj", 31);
        this.listaMiesiecy[5] = new Miesiac(6, "Czerwiec", 30);
        this.listaMiesiecy[6] = new Miesiac(7, "Lipiec", 31);
        this.listaMiesiecy[7] = new Miesiac(8, "Sierpień", 31);
        this.listaMiesiecy[8] = new Miesiac(9, "Wrzesień", 30);
        this.listaMiesiecy[9] = new Miesiac(10, "Październik", 31);
        this.listaMiesiecy[10] = new Miesiac(11, "Listopad", 30);
        this.listaMiesiecy[11] = new Miesiac(12, "Grudzień", 31);
    }

    public Miesiac[] getListaMiesiecy(){
        return this.listaMiesiecy;
    }

    // No setter required.
}

一般规则是:不要return property;getter和 setter 之外的 then 中放入任何其他内容this.property = property;。您应该在 (post)constructor 或 (action)listener 方法中执行业务逻辑。如果您需要在事件<f:selectItems>期间填充依赖于另一个值,请改用。<f:ajax><f:ajax listener>

顺便说一句,如果<f:selectItems value>是硬编码的,您还可以将属性放在值后面的单独应用程序范围的 bean 中,以便在应用程序的生命周期内只创建一次,而不是在每个 HTTP 请求上重复创建。

也可以看看:

于 2013-09-12T12:56:06.247 回答