Grails:如何在地图上放置minSize约束

时间:2013-03-18 17:38:03

标签: validation grails map grails-2.2

我有这个对象

@Validateable
class Foo {
    Map<String, String> items

    static constraints = {
        items minSize: 1
    }
}

但是这个测试失败了:

@Test
void shouldNotValidateIfItemsIsEmpty() {
    Foo foo = new Foo(items: [:])

    assert !foo.validate()
}

我做错了什么?它应该根据grails 'minSize' documentation工作:“设置集合或数字属性的最小大小。”

2 个答案:

答案 0 :(得分:7)

文档可能会产生误导。 minSize约束仅适用于:

  1. 字符串
  2. 阵列
  3. 实现java.util.Collection接口的类
  4. java.util.Map但不会扩展java.util.Collection接口

    请参阅supports的{​​{1}}方法:

    MinSizeConstraint

    根据Thermech的建议,您可以为此开发自己的custom constraint或自定义验证器

    此外,为了让Grails正确地模拟验证方法,您的测试类应该是这样的:

    public boolean supports(Class type) {
            return type != null && (
                    String.class.isAssignableFrom(type) ||
                    Collection.class.isAssignableFrom(type) ||
                    type.isArray());
        }
    

答案 1 :(得分:1)

我找到的唯一方法是使用自定义验证器:

static constraints = {
    items validator:  { Map map, obj, errors ->
        if (map.size() < 1) errors.rejectValue('items', 'minSize.notmet')
    }
}