List 上的 UISelectMany 导致 java.lang.ClassCastException:java.lang.String 无法转换为 T

2023-12-05

我在用<p:selectCheckboxMenu> on a List<Long>:

<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

同样的问题发生在<p:selectManyCheckbox>, <p:selectManyMenu>, <h:selectManyMenu>等等。基本上都是多选组件。它工作得很好<p:selectOneMenu>以及单个值上的所有其他单选组件Long财产。

这是如何引起的以及如何解决?


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

  1. Java 泛型是编译时语法糖,在运行时完全不存在。
  2. EL 表达式在运行时运行,而不是在编译时运行。
  3. HTTP请求参数为obtained as Strings.

逻辑结果是:EL 看不到任何泛型类型信息。 EL 没有看到List<Long>, but a List。因此,当您没有显式指定转换器时,EL 将在获取提交的值后将其转换为String将其设置为未修改的List by 反射方法。当您尝试将其投射到Long之后在运行时,你显然会面临ClassCastException.

解决方案很简单:显式指定一个转换器String to Long。您可以使用 JSF 内置LongConverter对于这个有转换器ID的javax.faces.Long。列出了其他内置转换器here.

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

无需显式指定转换器的另一种解决方案是更改List<T>键入一个T[]。这样 EL 将看到Long类型化数组,从而执行自动转换。但这可能需要对模型的其他地方进行更改,这可能是不可取的。

private Long[] selectedItems;

如果您使用复杂对象(javabean、实体、POJO 等)作为选择项值而不是标准类型,例如Long对于 JSF 有内置转换器的情况,同样的规则也适用。您只需要创建一个自定义的Converter并在输入组件中明确指定它converter属性,或依赖forClass如果你可以使用T[]。如何创建这样的转换器在“null Converter”的转换错误设置值.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

List 上的 UISelectMany 导致 java.lang.ClassCastException:java.lang.String 无法转换为 T 的相关文章

随机推荐

  • 在新容器 docker 构建期间访问正在运行的容器

    如何在新容器docker构建期间访问正在运行的容器 应用容器构建过程中需要访问数据库容器 docker 撰写 version 3 services db build db ports 1433 1433 networks mynetwork
  • redis 中的嵌套哈希

    我想使用哈希的哈希 嵌套哈希 例如 Key 1 gt Subkey 1 gt Value1 Value2 Subkey 2 gt Value1 Value2 Subkey n gt Value1 Value2 Key 2 gt Key n
  • Android Lint:如何抑制与支持库相关的所有警告?

    我正在尝试使用 Android Lint 来保持代码顺利运行 但由于我使用的是 support v7 appcompat Lint 返回了一个巨大的 溢出的警告列表 如何抑制所有这些问题 以便我只能看到我自己的应用程序的问题 在 Lint
  • 为什么在 Swift 中,dispatch_queue_create 会给出 EXC_BAD_ACCESS 错误?

    我正在将一些使用 Grand Central Dispatch 的代码从 C 移植到 Swift 并且发现了一个奇怪的错误 dispatch queue create 似乎根本不起作用 例如 在我的 C 基类标头中 我会声明 dispatc
  • Date.getDay() javascript 返回错误的日期

    我有这样的javascript代码 alert DATE value var d new Date DATE value var year d getFullYear var month d getMonth var day d getDa
  • jQuery:.click() 和 .on("click") 之间的区别

    我通常使用 selector click 但有些人建议我改用这个 selector on click function Or selector live click 已弃用 我读了说明书 但我初学者的头脑无法理解 我对他们使用的所有术语感到
  • 微电网电池调度的约束优化

    给定电力消耗 太阳能电池板发电 价格等输入 全部在给定时间 t 我们有一个电池 我们想要评估它在任何给定时间应该 放电 充电多少 该问题可以表述如下 Pt price of electricity at time t Lt consumpt
  • 多次调用 imageWithData:UIImageJPEGRepresentation() 仅第一次压缩图像

    为了防止我的应用程序出现滞后 我尝试压缩大于 1 MB 的图像 主要是从 iPhone 的普通相机拍摄的照片 UIImage image info objectForKey UIImagePickerControllerOriginalIm
  • 使用 swift 获取 HTTP 状态

    很抱歉 我还没有找到我的问题的答案 请不要太严厉 我不是专业程序员 但我不断学习 希望一旦我能够回答别人的问题 我正在尝试获取链接的 HTTP 状态 我根据一个数据库条目代码生成链接 例如 ABCDEF 我将它们保存在一个数组中 然后生成指
  • 什么布局管理器会执行此操作?

    OY 没有足够的代表点来发布图像 joes pizza pizza type toppings cheese mushrooms 15 00 veggie extra cheese p
  • Rollup、Vue 和 Buble、scss 文件中出现意外标记

    我正在尝试使用 Vue 和 Buble 按照 Vue 官方页面中提供的示例 使用 rollup 来编译 SFC 但我不断收到此错误 src wrapper js dist chat min js plugin buble SyntaxErr
  • 在 WPF 中缓慢平移和缩放

    我在 WPF 的几块画布上绘制了大量的线条和文本 我在 WPF 中使用了最轻量级的元素 DrawingVisual 我在不同的画布上画了线 并绑定了它们thickness为缩放系数的倒数 这样我可以在缩放时获得均匀的线条粗细 这意味着当我缩
  • 正则表达式中的否定字符[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我如何编写符合以下条件的正则表达式 没有数字 没有特殊字符 没有空间 在一个字符串中 字符类 中的插入符号是大多数正则表达式实现 Perl NET Ruby Javascript 等
  • VB6 应用时序

    我正在尝试分析 VB6 应用程序 基本上我想在方法级别计算出执行花费了多少时间 然而VB6只支持1秒的时间 有什么好的方法可以计算出毫秒等吗 虽然MSDNsays Timer仅精确到1秒 我发现它比实践中的要好 获取刻度数通常准确到abou
  • 将 C“FOR”循环转换为 Delphi

    我正在尝试将 FOR 循环从 C 转换为 Delphi 但我有一些疑问 我知道 C 中的这段代码 for i 0 i lt mb gt size i 在Delphi中是这样的 for i 0 to mb size do begin end
  • 在 AngularJS ng-repeat 中对集合进行分组?

    我有一个非常简单的场景 其中有一组记录可用 我需要以简单的 ng repeat 方式显示它们 但是 我需要按属性对记录进行分组 并且我的目标不是不必更改集合即可完成此分组 我的想法是可以应用某种类型的过滤器 但在实践中过滤器 很好地过滤数据
  • 如何创建一个函数来计算每个元素等于其右侧 2 个元素的次数

    我知道我需要使用列表理解 但我一生都无法弄清楚表示这一点的正确方法是什么 此运行权的一个示例是 晚上 一次输出为 2 代表 e 一次代表 n 列表推导式将具有相同字母的字母放在右侧两个位置 我们只需计算结果列表的长度 s evening a
  • 在 shell 脚本中使用 passwd 命令

    我正在编写一个 shell 脚本来自动添加新用户并更新其密码 我不知道如何让 passwd 从 shell 脚本中读取 而不是以交互方式提示我输入新密码 我的代码如下 adduser 1 passwd 1 2 2 from man 1 pa
  • 在 UIActivityViewController 中与不同类型共享数据

    以下帖子提出了一个极其相似的问题 UIActivityViewController 中共享提供程序的不同数据 但我的问题不同 我知道如何通过使用与不同的活动共享相同类型的不同数据itemForActivityType 例如 id activ
  • List 上的 UISelectMany 导致 java.lang.ClassCastException:java.lang.String 无法转换为 T

    我在用