当前位置: 首页 > 知识库问答 >
问题:

导致java.lang.ClassCastException:java.lang.字符串不能强制转换为T

寿意远
2023-03-14

我正在使用

<p:selectCheckboxMenu value="#{bean.selectedItems}">
    <f:selectItems value="#{bean.availableItems}" />
</p:selectCheckboxMenu>
private List<Long> selectedItems;
private Map<String, Long> availableItems;

提交表单并按如下方式循环选择项目时,

for (int i = 0; i < selectedItems.size(); i++) {
    Long id = selectedItems.get(i);
    // ...
}

然后我得到一个类强制转换异常:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
    at com.example.Bean.submit(Bean.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 27 more

也会出现同样的问题

这是怎么造成的,我该如何解决?


共有1个答案

杜辉
2023-03-14

您的问题是由以下事实引起的:

  1. Java泛型是compiletime语法糖,在运行时完全不存在
  2. EL表达式在运行时运行,而不是在编译时运行
  3. HTTP请求参数以Strings的形式获取

逻辑结果是:EL看不到任何泛型类型信息。EL没有看到列表

解决方案很简单:为StringLong显式指定一个转换器。您可以使用JSF内置的LongConverter,它具有转换器IDjavax。面孔。长。此处列出了其他内置转换器。

<p:selectCheckboxMenu ... converter="javax.faces.Long">

另一种不需要显式指定转换器的解决方案是更改列表

private Long[] selectedItems;

如果使用复杂对象(javabean、entity、POJO等)作为选择项值,而不是JSF内置转换器的标准类型,如Long,那么同样的规则也适用。您只需要创建一个自定义的转换器,并在输入组件的转换器属性中明确指定它,或者如果可以使用T[],则可以依赖forClass。“空转换器”的转换错误设置值详细说明了如何创建这样的转换器。

 类似资料: