1

配列からドロップダウン メニューを作成しようとしていますが、常に nullPointerException/. 私はすべてを試しました: - セッターでデータで配列を作成します - 配列がnullの場合はゲッターでセッターを呼び出します - ゲッターで新しい配列オブジェクトを作成してセッターで埋めようとしました - ajaxでドロップダウンを実行してから埋めようとしましたと

このworekdのどれも:/ 今日のためにそれをしなければならないので、今のところドロップダウンをハードコーディングしましたが、どこで間違いをしたか知りたいです:/

ページからのドロップダウンコードは次のとおりです。

<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 が送信された値でモデル値を更新する必要がある場合にのみ、入力コンポーネントに対して呼び出されます。たとえば、<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.
}

一般的なルールは次のとおりです。 then 以外の getter と setter 以外のものを入れないでください。代わりに、(ポスト) コンストラクターまたは (アクション) リスナー メソッドでビジネス ロジックを実行する必要があります。イベント中に別の値に応じて値を設定する必要がある場合は、代わりに使用してください。return property;this.property = property;<f:selectItems><f:ajax><f:ajax listener>

ちなみに、<f:selectItems value>ハードコーディングされている場合は、別のアプリケーション スコープ Bean の値の背後にプロパティを配置することもできます。これにより、すべての HTTP 要求で繰り返し作成されるのではなく、アプリケーションの有効期間中に 1 回だけ作成されます。

以下も参照してください。

于 2013-09-12T12:56:06.247 に答える