假设我有以下Foo
对象:
Foo foo = new Foo(foo: "foo", bar: "bar", baz: "baz")
我知道如何验证特定约束:
foo.validate(["foo", "bar"]) // validates the "foo" property and the "bar" property, but not the "baz" property
我也知道如何放弃验证:
foo.save(validate: false)
但我不知道如何告诉Grails验证所有约束除了列表中的约束。我可以创建一个能够实现我想要的方法,但我想确保首先没有Groovy方法。
更新
如果没有“groovier”方式,我将如何做到这一点。
// This method exists in my Util.groovy class in my src/groovy folder
static def validateWithBlacklistAndSave(def obj, def blacklist = null) {
def propertiesToValidate = obj.domainClass.constraints.keySet().collectMany{ !blacklist?.contains(it)? [it] : [] }
if(obj.validate(propertiesToValidate)) {
obj.save(flush: true, validate: false)
}
obj
}
答案 0 :(得分:9)
考虑以下Foo
域类
class Foo {
String foo
String bar
String baz
static constraints = {
foo size: 4..7
bar size: 4..7
baz size: 4..7
}
}
baz
的验证可以排除如下:
Foo foo = new Foo(foo: "fool", bar: "bars", baz: "baz")
//Gather all fields
def allFields = foo.class.declaredFields
.collectMany{!it.synthetic ? [it.name] : []}
//Gather excluded fields
def excludedFields = ['baz'] //Add other fields if necessary
//All but excluded fields
def allButExcluded = allFields - excludedFields
assert foo.validate(allButExcluded)
assert foo.save(validate: false) //without validate: false, validation kicks in
assert !foo.errors.allErrors
没有直接的方法来发送排除字段列表以进行验证。
答案 1 :(得分:0)
您可以定义自定义的constraints地图,然后您可以从支持命令类或Config.groovy
通过 exclude
参数有效地进行过滤。