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

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

我不明白。

非常感谢任何帮助。

瑞恩

最佳答案

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

也可以看看:
  • How to use enums in select many menus?
  • 关于java - <h :selectManyListbox JSF and Enums Class Cast error,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5340762/

    10-16 06:52