这让我发疯,找不到错误。
这里是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
答案 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">