<h:selectManyListbox JSF和Enums Class Cast错误

ree*_*een 3 java jsf enums

这让我发疯,找不到错误.

这里是xhtml页面:

...
<h:selectManyListbox style="width: 207px" size="10" value="#{reportBean.selectedSeverities}">
                            <f:selectItems value="#{reportBean.severities}"/>
                        </h:selectManyListbox>
...
Run Code Online (Sandbox Code Playgroud)

报告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;
}
Run Code Online (Sandbox Code Playgroud)

对于命令按钮,我有以下操作方法:

if (!selectedSeverities.isEmpty()) {
    Severity s = selectedSeverities.get(0);
}
return;
Run Code Online (Sandbox Code Playgroud)

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

...
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to securityscan.util.Severity
...
Run Code Online (Sandbox Code Playgroud)

我不明白.

任何帮助都非常赞赏.

BR Reen

Bal*_*usC 7

如果不使用h:selectMany***转换器,则不能将枚举与组件结合使用.JSF/EL没有看到/知道每个单独列表项的泛型类型.换句话说,它只会看到a List而不是List<Severity>将每个项目视为a 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

(请注意,当您仍在使用旧的JSF 1.2时,您应该将其声明为<converter>in faces-config.xml而不是by @FacesConverter)

你使用如下:

<h:selectManyListbox converter="severityConverter">
Run Code Online (Sandbox Code Playgroud)

也可以看看: