我的控制器中有Map<String, Boolean>
private Map<String, Boolean> selectedRequestsMap;
selectedRequestsMap = new HashMap<String, Boolean>();
当我把元素添加到其中时(正如Boolean
值)
selectedRequestsMap.put(StringValue, booleanValue);
但是当我遍历一个Map来读取值时
它被考虑(作为String
值)
// Loop over selectedRequestsMap
for (Map.Entry<String, Boolean> entry : selectedRequestsMap.entrySet()) {
String key = entry.getKey();
Boolean value = entry.getValue(); // An Exception is raised
// ...
}
然后当我读取Boolean
值
An Exception
被提出
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
需要知道
我怎么能正常读取Boolean
值?
答案 0 :(得分:1)
您操纵地图值的方式已被破坏。您已将字符串值设置为"true"
,而不是布尔文字true
。它传递参数化泛型类型约束只能意味着它是通过反射完成的。考虑到在JSF上下文中询问了这个问题,这反过来意味着您正在使用JSF标记和EL操纵视图中的地图值。在这种情况下,您不应在EL中指定"true"
,而应指定#{true}
。
您没有在SSCCE风格中显示问题,因此很难指出错误并提供准确的答案。所以,这只是最可能的原因之一:
<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
<f:selectItem itemLabel="Yes" itemValue="true" />
<f:selectItem itemLabel="No" itemValue="false" />
</h:selectOneRadio>
这不仅是设计技术错误(你应该使用<h:selectBooleanCheckbox>
代替),但这在功能上也是错误的,因为它将项目值指定为纯字符串而不是真正的布尔值。在此构造中,EL将无法将这些字符串自动强制转换为布尔值,因为在运行时期间,映射值的参数化泛型类型信息不可用。 EL不知道map值是一个布尔值而没有明确的converter
,因此它会将普通的未转换字符串提交值放在那里。
然后修复将在EL上下文中明确指定为布尔值:
<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
<f:selectItem itemLabel="Yes" itemValue="#{true}" />
<f:selectItem itemLabel="No" itemValue="#{false}" />
</h:selectOneRadio>