JSF f: выбор элементов с использованием ошибки списка - PullRequest
1 голос
/ 30 декабря 2011

Код Facelet:

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

Я шаг за шагом следовал некоторым учебникам, но продолжаю получать эту ошибку.Я попытался сделать List static и инициализировать значения в статическом блоке, но я получил ту же ошибку.

EDIT:

Новый Bean Code

@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 () , появляется сообщение о том, что атрибут страны не существует .

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

Сначала инициализируйте ваш arrayList

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

Ваш код для фейсликов выглядит отлично .

2 голосов
/ 30 декабря 2011
private final List<SelectItem> countries = new ArrayList<SelectItem>();

Инициализируйте и объявите List как "final", если вы хотите, чтобы объект стран больше не создавался. Хорошей практикой является использование final, который также улучшает читабельность кода.

2 голосов
/ 30 декабря 2011

В своем конструкторе бинов вы должны сначала создать свой список, попробуйте следующее:

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}" />

ОБНОВЛЕНИЕ : предположим, у вас есть следующий контроллер

@ManagedBean
@RequestScoped
public class BeanController {
   private String countryResidence;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...