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

The*_*ech 2 validation grails map grails-2.2

我有这个对象

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

    static constraints = {
        items minSize: 1
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个测试失败了:

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

    assert !foo.validate()
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?它应该根据grails'minSize'文档工作:"设置集合或数字属性的最小大小."

Dro*_*sky 7

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

  1. 数组
  2. 实现java.util.Collection接口的类

java.util.Map但是不会延长java.util.Collection的接口

supports方法MinSizeConstraint:

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

您可以按照Thermech的建议为此或自定义验证器开发自己的自定义约束

另外,为了让Grails正确地模拟validate方法,你的测试类应该是这样的:

@TestMixin(ControllerUnitTestMixin) class FooTest {
    @Test
    void shouldNotValidateIfItemsIsEmpty() {
        Foo foo = mockCommandObject Foo

        foo.items = [:]

        assert !foo.validate()
    } }
Run Code Online (Sandbox Code Playgroud)