0

我的控制器中有一个Map<String, Boolean>

private Map<String, Boolean> selectedRequestsMap;
selectedRequestsMap = new HashMap<String, Boolean>();

当我将元素放入其中时,通常会添加(作为Boolean值)

selectedRequestsMap.put(StringValue, booleanValue);

在此处输入图像描述 但是当我遍历地图以读取
其考虑的值时(作为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正常读取值?

4

1 回答 1

1

您操作地图值的方式被破坏了。您设置了一个字符串值,"true"而不是布尔文字true。它通过了参数化的泛型类型约束只能意味着它是通过反射完成的。考虑到这个问题是在 JSF 上下文中提出的,这反过来意味着您正在使用 JSF 标记和 EL 在视图侧操作地图的值。在这种情况下,您不应该"true"在 EL 中指定,而是在#{true}.

您没有以 SSCCE 风格显示问题,因此很难指出错误并提供准确的答案。因此,这只是最可能的原因之一:

<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
    <f:selectItem itemLabel="Yes" itemValue="true" />
    <f:selectItem itemLabel="No" itemValue="false" />
</h:selectOneRadio>

这不仅在设计技术上是错误的(您应该使用 a<h:selectBooleanCheckbox>代替),而且在功能上也是错误的,因为它将项目值指定为纯字符串而不是真正的布尔值。在此构造中,EL 将无法将这些字符串自动强制转换为布尔值,因为映射值的参数化泛型类型信息在运行时不可用。EL 不知道 map 值是一个 boolean 并且没有明确的converter,因此它会将未转换的普通字符串提交值放在那里。

然后解决方法是在 EL 上下文中将它们显式指定为布尔值:

<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
    <f:selectItem itemLabel="Yes" itemValue="#{true}" />
    <f:selectItem itemLabel="No" itemValue="#{false}" />
</h:selectOneRadio>

也可以看看:

于 2013-05-30T13:02:52.230 回答