我们在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
答案 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 = {
}
}
我希望有所帮助。