【问题标题】:<h:selectManyListbox JSF and Enums Class Cast error<h:selectManyListbox JSF 和枚举类转换错误
【发布时间】:2011-03-17 14:53:52
【问题描述】:

这让我抓狂,找不到错误。

这里是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雷恩

【问题讨论】:

    标签: java jsf enums


    【解决方案1】:

    您不能在不使用转换器的情况下将枚举与h:selectMany*** 组件结合使用。 JSF/EL 看不到/知道每个单独列表项的通用类型。换句话说,它只看到List 而不是List&lt;Severity&gt;,并将每个项目都视为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 时,您应该在 faces-config.xml 中将其声明为 &lt;converter&gt; 而不是 @FacesConverter

    你使用如下:

    <h:selectManyListbox converter="severityConverter">
    

    另见:

    【讨论】:

    • 你救了我的命!!!!我找了一下午。不知道我需要一个 Enum 转换器。非常感谢您的帮助。
    • 不客气。顺便说一下,它与枚举没有特别的关系,而是与所有类型有关。 List&lt;Long&gt; 或其他东西也会有同样的问题。问题只是 JSF/EL 不知道列表类型,并且盲目地将未转换的请求参数字符串放在那里。另请参阅答案底部的“另请参阅”链接。例如,在使用 &lt;h:selectOneMenu&gt; 时,枚举可以在没有显式转换器的情况下正常工作。
    • 好的,这就是为什么我认为没有必要。我已经将枚举与
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多