2011-12-30 2 views
1

Facelet 코드 :JSF의 F : 목록 오류를 사용하여 selectItems

<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. 

나는 몇 가지 자습서를 단계별로 따라 갔지만이 오류가 계속 발생합니다. 리스트 을 정적 인으로 만들고 정적 블록의 값을 초기화하려고 시도했지만 동일한 오류가 발생합니다.

편집 :

새로운 콩 코드

@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 : 당신이

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

귀하의 Facelets의 코드가 보인다 먼저 ArrayList를 초기화 다음 컨트롤러

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

국가 목록에 SelectItem 인스턴스가 이미있는 경우 왜 _itemLabel_ 및 _itemValue_를 지정해야합니까? – Ionut

+0

다른 속성이 없어도 정상적으로 작동하는 것 같습니다. 소스 코드도 확인했는데 결과가 원하는 것입니다. 감사! – Ionut

+0

안녕하세요. :) –

2

이 있다고 가정합니다.

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

국가 개체를 다시 인스턴스화하지 않으려면 목록을 "최종"으로 초기화하고 선언하십시오. final을 사용하면 코드의 가독성을 향상시키는 것이 좋습니다.

+0

흠, 이것이 꼭 필요한가요? 이 빈은'@ ApplicationScoped'를 가지고 있기 때문에이리스트를 다시 초기화하는 추가 호출이 없다면 응용 프로그램의 수명 내내 동일하게 유지 될 것이라고 생각합니다. –

+0

물론 그럴 필요는 없지만, 나는 확실히 불변의 목록을 할당 할 것이다. 또한 그것이 최종적이라면 이는 코드를 읽는 사람들을위한 추가 보장과 의도의 선언입니다. –

관련 문제