‹H: selectManyListbox JSF и ошибка приведения класса Enums

Это сводит меня с ума, не могу найти ошибку.

Вот страница xhtml:

...
<h:selectManyListbox style="width: 207px" size="10" value="#{reportBean.selectedSeverities}">
                            <f:selectItems value="#{reportBean.severities}"/>
                        </h:selectManyListbox>
...

Отчет Bean:

...
private List<Severity> severities;
private List<Severity> selectedSeverities = new ArrayList<Severity>();
...
public List<Severity> getSeverities() {
   if (this.severities == null) {
        this.severities = new ArrayList<Severity>();
        this.severities.add(Severity.LOW);
        this.severities.add(Severity.HIGH);
        this.severities.add(Severity.UNDEFINED);
        this.severities.add(Severity.MEDIUM);
    }
        return severities;
}

Для командной кнопки у меня есть следующий метод действия:

if (!selectedSeverities.isEmpty()) {
    Severity s = selectedSeverities.get(0);
}
return;

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

...
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to securityscan.util.Severity
...

Я не понимаю.

Любая помощь очень ценится.

BR Reen


person reen    schedule 17.03.2011    source источник


Ответы (1)


Вы не можете использовать перечисления в сочетании с h:selectMany*** компонентами без конвертера. JSF / EL не видит / не знает общий тип каждого отдельного элемента списка. Другими словами, он видит только List, а не List<Severity>, и обрабатывает каждый элемент как String, если вы не укажете иное.

Вам необходимо создать и указать конвертер самостоятельно. Для перечислений лучше всего расширить предоставляемый JSF EnumConverter.

package com.example;

import javax.faces.convert.EnumConverter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value="severityConverter")
public class SeverityConverter extends EnumConverter {

    public SeverityConverter() {
        super(Severity.class);
    }

}

(обратите внимание, что когда вы все еще используете старую JSF 1.2, вы должны объявить это как <converter> в faces-config.xml, а не как @FacesConverter)

Что вы используете следующим образом:

<h:selectManyListbox converter="severityConverter">

Смотрите также:

person BalusC    schedule 17.03.2011
comment
Вы спасли мне жизнь !!!! Я искал весь день. Не знал, что мне нужен конвертер для Enum. Спасибо большое за вашу помощь. - person reen; 17.03.2011
comment
Пожалуйста. Между прочим, это не относится конкретно к перечислениям, а ко всем типам. У вас будет такая же проблема с List<Long> или чем-то в этом роде. Проблема просто в том, что JSF / EL не знает о типе списка и бессознательно помещает туда непреобразованные строки параметров запроса. См. Также ссылку См. Также внизу ответа. Перечисления отлично работают без явного преобразователя, например, при использовании <h:selectOneMenu>. - person BalusC; 17.03.2011
comment
Хорошо, вот почему я подумал, что в этом нет необходимости. Я использовал перечисления в сочетании с ‹h: selectOneMenu уже без конвертеров. - person reen; 17.03.2011