2011-12-30 14 views
1

にfaceletコード:JSFのF:リストのエラーを使用して選択項目

<h:selectOneMenu id = "country" label = "country" value = "#{beanController.countryResidence}"> 
    <f:selectItems value = "#{countries.countries}" /> 
</h:selectOneMenu> 

豆コード:

@ManagedBean(eager=true, name = "countries") 
@ApplicationScoped 
public class CountriesConstants { 
     private List<SelectItem> countries; 
     public CountriesConstants(){ 
      countries.add(new SelectItem("DE", "Germany")); 
      countries.add(new SelectItem("JA", "Japan")); 
      countries.add(new SelectItem("RU", "Russia")); 
      countries.add(new SelectItem("US", "United States")); 
     } 
     public List<SelectItem> getCountries() { 
      return countries; 
     } 
     public void setCountries(List<SelectItem> countries) { 
      this.countries = countries; 
     } 
} 

エラー

SEVERE:例外アプリ

のロード中
SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.mysite.util.CountriesConstants. 

私はいくつかのチュートリアルを順を追って説明しましたが、このエラーが続いています。リストを静的にして静的ブロックの値を初期化しようとしましたが、同じエラーが発生します。

EDIT:

新しい豆コード

@ManagedBean(eager=true, name="constants") 
@ApplicationScoped 
public class Constants { 

    public static final String VALIDATE_DETAILED = "detailed"; 
    public static final List<SelectItem> countries; 

    static{ 
     countries = new ArrayList<SelectItem>(); 
     countries.add(new SelectItem("DE", "Germany")); 
     countries.add(new SelectItem("JA", "Japan")); 
     countries.add(new SelectItem("RU", "Russia")); 
     countries.add(new SelectItem("US", "United States")); 
    } 

    public List<SelectItem> getCountries() { 
     return countries; 
    } 
} 

これが動作しているようですが、私はそれが奇妙な私は非静的メソッドと静的属性にアクセスできることを見つけます。 getCOuntries()メソッドを削除すると、の国属性が存在しないというエラーが発生します。がスローされます。あなたの豆のコンストラクタで

+0

例外を取得するときは、常にスタックトレースの一番下の部分を見てください。非常に自己説明的な 'NullPointerException'があります。 – BalusC

答えて

2

、あなたが最初にあなたのリストを作成する必要があり、これを試してみてください。

public CountriesConstants(){ 
    countries = new LinkedList<SelectItem>(); 
    countries.add(new SelectItem("DE", "Germany")); 
    countries.add(new SelectItem("JA", "Japan")); 
    countries.add(new SelectItem("RU", "Russia")); 
    countries.add(new SelectItem("US", "United States")); 
} 

はまた、あなたの <f:selectItems>タグは、より多くの属性を持っている必要があります。このような何か:

<f:selectItems value="#{countries.countries}" var="c" itemLabel="#{c.name}" itemValue="#{c.id}" /> 

UPDATE:あなたは、次のコントローラ

@ManagedBean 
@RequestScoped 
public class BeanController { 
    private String countryResidence; 
} 
+0

国リストに既にSelectItemインスタンスが含まれている場合は、なぜ_itemLabel_および_itemValue_を指定する必要がありますか? – Ionut

+0

他の属性がなくてもうまくいくようです。私はソースコードもチェックして、結果が望ましいものです。ありがとう! – Ionut

+0

よろしくお願いします! :) –

2

があなたのArrayListを初期化しているとし最初

private List<SelectItem> countries = new ArrayList<SelectItem>(); 

あなたのFaceletsのコードは、細かいです。

2
private final List<SelectItem> countries = new ArrayList<SelectItem>(); 

国オブジェクトを再度インスタンス化しないようにするには、リストを「最終」として初期化して宣言します。コードの可読性を向上させるfinalを使用することは良い習慣です。

+0

こんにちは、これが必要だと確信していますか?このBeanは '@ ApplicationScoped'を持っているので、このリストを再初期化する追加の呼び出しがない限り、アプリケーションの存続期間全体にわたって同じ状態を維持すると思います。 –

+0

もちろん、必ずしも必要ではありませんが、私はそれを不変のリストにして確実に割り当てます。それが最終的なものであれば、それはコードを読んでいる人のための特別な保証と意図の宣言です。 –

関連する問題