我的JSF托管bean中有一个属性:
private List<Long> selectedDataSets;
我在其他方法中将这个列表初始化为:
ArrayList<Long> longList = new ArrayList<>();
当我跳到这个foreach时,我会得到java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
正确的结果:
for (Long CRC : selectedDataSets) { ... }
这很奇怪。调试显示selectedDataSets
已满String
个值,但我认为这甚至不可能。请描述一下我在这里发生了什么。
答案 0 :(得分:4)
显然,您已将该属性绑定到UISelectMany
组件,例如<h:selectManyCheckbox>
或<selectManyListbox>
,而未明确指定Converter
。在Java中,generic type在运行时期间是erased,而JSF(更具体地说,EL)根本不知道关于通用列表类型的任何内容,默认为String
,除非{ {3}}。它是Converter
,因为这只是String
的默认值类型。 EL使用HttpServletRequest#getParameterMap()
提交的值填充列表,并且不考虑任何泛型类型。
所以,例如,在内置reflection的帮助下,这应该为你做到:
<h:selectManyCheckbox value="#{bean.selectedDataSets}" converter="javax.faces.Long">
请注意,这与Java 7的钻石操作符无关。当您尝试使用new ArrayList<Long>()
时,您会遇到完全相同的问题。