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
相关产品推荐
相关产品推荐

