You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSFContainer2.2升级至2.3后List<String>接收Long值抛类型转换异常

解决JSF 2.3升级后<p:selectManyListbox>类型转换异常问题

这个问题的核心原因是JSF 2.3对类型转换的严格性做了提升:在JSF 2.2中,框架会隐式地将Long类型的值自动转换为String并存入泛型为String的集合;但JSF 2.3取消了这种宽松的隐式转换,严格遵循泛型定义,导致Long对象直接被存入List<String>,遍历的时候就会抛出ClassCastException。

下面提供几种可行的解决方案,按推荐程度排序:

方案1:修改集合类型为匹配的List<Long>(最推荐)

既然你选中的是ob对象的Long类型ID,直接将basisList的泛型改为Long更符合数据语义,也能从根源避免类型转换问题:

// 原代码
// List<String> basisList;

// 修改后
List<Long> basisList;

遍历的时候如果需要字符串形式,显式转换即可:

for(Long i : basisList) {
    System.out.println(i.toString()); // 或者 String.valueOf(i)
}

方案2:在<f:selectItems>中显式将Long转为String

如果不想修改集合类型,可以直接在页面层将itemValue转换为字符串类型,这样存入List<String>的就是原生字符串了:

<p:selectManyListbox id="acl" value="#{controller.process.basisList}" >
    <f:selectItems value="#{controller.filinglist}" 
                   var="item" 
                   itemValue="#{item.id.toString()}" 
                   itemLabel="#{item.name}" />
</p:selectManyListbox>

这里通过item.id.toString()直接把Long类型的ID转为字符串,提交后会直接存入List<String>,无需额外转换。

方案3:自定义转换器处理类型转换

如果需要更灵活的转换逻辑,可以自定义一个JSF转换器,专门处理Long到String的双向转换:

第一步:创建转换器类

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter("longToStringConverter")
public class LongToStringConverter implements Converter<String> {

    @Override
    public String getAsObject(FacesContext context, UIComponent component, String value) {
        // 将页面提交的字符串(Long的字符串形式)直接返回为String,存入集合
        return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, String value) {
        // 将集合中的String转换为页面显示的字符串形式(直接返回即可)
        return value;
    }
}

第二步:在组件中引用转换器

<p:selectManyListbox id="acl" value="#{controller.process.basisList}" >
    <f:converter converterId="longToStringConverter" />
    <f:selectItems value="#{controller.filinglist}" 
                   var="item" 
                   itemValue="#{item.id}" 
                   itemLabel="#{item.name}" />
</p:selectManyListbox>

这个方案适合需要统一处理多处Long转String场景的情况。

内容的提问来源于stack exchange,提问作者Jai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:08:44