时间:2011-03-17 14:53:52

标签: java 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;

Wenn我选择严重性(枚举)并点击命令按钮我得到以下堆栈跟踪:

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

我不明白。

任何帮助都非常赞赏。

BR Reen

1 个答案:

答案 0 :(得分:7)

如果不使用转换器,则无法将枚举与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">

另见: