Grails使用默认值验证字段

时间:2014-09-19 16:38:27

标签: validation grails grails-2.4

我们在Grails 2.4.3应用程序中有一个这样的类(从2.3.8迁移):

@Validateable
class Foo {
    Integer noDefault;
    Integer withDefault = 1;

    static constraints = {
        noDefault(nullable:false)
        withDefault(nullable:false)
    }
}

使用类似这样的Map在复杂的配置机制中实例化此类:

[
    noDefault: 0,
    withDefault: 2
]

(实际上Map是一个巨大的一部分,但是类构造函数看到这个小的。)如果我们从配置映射中省略了withDefault条目,使用默认值not null,以前该类是有效的。但是,在Grails 2.4.3中,它告诉我该字段不能为空。我可以通过让它在约束中为空来修复它,但它允许将explicite值设置为null(并覆盖默认值),这会在操作期间导致问题。

你知道一些解决方法,它保留了语义和正确的操作吗?

Thanx提前,最好的问候:Balázs

1 个答案:

答案 0 :(得分:0)

你所描述的与我所期望的不一致,与我所看到的行为不一致。 https://github.com/jeffbrown/validatedefaults项目包含以下代码。

https://github.com/jeffbrown/validatedefaults/blob/master/src/groovy/demo/Foo.groovy

// src/groovy/demo/Foo.groovy
package demo

import grails.validation.Validateable

@Validateable
class Foo {
    Integer noDefault;
    Integer withDefault = 1;

    static constraints = {
        noDefault(nullable:false)
        withDefault(nullable:false)
    }
}

https://github.com/jeffbrown/validatedefaults/blob/master/test/unit/demo/FooSpec.groovy的测试通过:

// test/unit/demo/FooSpec.groovy
package demo

import spock.lang.Specification
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin

@TestMixin(GrailsUnitTestMixin)
class FooSpec extends Specification {

    void 'test validating default values'() {
        given:
        def map = [noDefault: 0]
        def foo = new Foo(map)

        expect:
        foo.validate()
    }
}

当我运行应用程序时,我得到了相同的行为。

// grails-app/conf/BootStrap.groovy
import demo.Foo

class BootStrap {

    def init = { servletContext ->
        def map = [noDefault: 0]
        def foo = new Foo(map)

        // this prints true...
        println "Foo is valid? : ${foo.validate()}"
    }
    def destroy = {
    }
}

我希望有所帮助。