这让我发疯,找不到错误。
这是 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">
也可以看看:
关于java - <h :selectManyListbox JSF and Enums Class Cast error,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5340762/