当值为null时,Spring Webflow AttributeMap不应用默认值或检查类

时间:2015-07-27 08:31:17

标签: java spring-webflow

关于Spring Webflow 2.4.1.RELEASE。

JavaDoc for AttributeMap包含(String attributeName,Class requiredType)状态:

"此地图中是否存在具有提供名称的属性,是否为指定所需类型的值?"

但是,如果密钥存在但值为null,则认为这是可接受的,并且不会抛出IllegalArgumentException。

同样,JavaDoc for get(String attributeName,V defaultValue)状态

"获取属性值,如果未找到任何值,则返回默认值。"

但是,如果密钥存在但值为null,则不使用默认值。

以前是defect SWF-343 in 2007

这可以用例如

进行测试
MutableAttributeMap<Object> flowScope = new LocalAttributeMap<Object>();

flowScope.put("key", null);

assertFalse(flowScope.contains("key", Boolean.class));

assertTrue((boolean) flowScope.get("key", Boolean.TRUE));

assertTrue(flowScope.getBoolean("key", Boolean.TRUE));

所有这些最终都会通过MapAccessor中的代码来处理null

public <T> T assertKeyValueInstanceOf(Object key, Object value, Class<T> requiredType) {
    Assert.notNull(requiredType, "The required type to assert is required");
    if(value != null && !requiredType.isInstance(value)) {
        throw new IllegalArgumentException("Map key \'" + key + "\' has value [" + value + "] that is not of expected type [" + requiredType + "], instead it is of type [" + value.getClass().getName() + "]");
    } else {
        return value;
    }
}

似乎如果JavaDoc是正确的,那么代码是错误的,反之亦然。

应该&#34; null&#34;传递&#34; requiredType&#34;测试特定类型?

应该&#34; null&#34;被视为&#34;价值&#34;在考虑是否应用默认值时?

如果处理的代码与JavaDoc建议的方式无效,那么我将能够做得更清洁:

if(getFlowScope().contains(key, Boolean.class)){
    return getFlowScope().getBoolean(key);
}

return false;

实际上,为了安全地访问flowScope属性,允许键不存在,null和错误类型,我必须这样做:

try {
        Boolean value = getFlowScope().getBoolean(key);
        return value == null ? false : value;

    }catch(IllegalArgumentException e){
        return false;
    }

对于flowcope属性的类型安全和零安全检索,是否有更清晰的替代方法?

0 个答案:

没有答案