PullRequest
       18

3 голосов
/ 17 марта 2011

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

Здесь страница xhtml:

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

Бин отчета:

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

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

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

Я не понимаю.

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

BR Reen

1 Ответ

7 голосов
/ 17 марта 2011

Нельзя использовать перечисления в сочетании с 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">

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...