Grails 如何跳过特定约束的验证?
假设我有以下Grails 如何跳过特定约束的验证?,grails,Grails,假设我有以下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验证
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的方法可以先做
更新
如果没有“更常规”的方法,我会这样做
您可以定义自定义映射,然后可以通过
exclude
参数从支持的命令类或Config.groovy
中有效地过滤这些映射 考虑以下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
没有直接的方法发送排除字段的列表进行验证。答案有用吗?我实际上是在寻找一种“groovier”方法来实现这一点,所以我不确定这是否有用。如果不存在我期望使用的“groovier”方法,但看起来您的解决方案基本上也在做同样的事情。不幸的是,我唯一不想验证的字段是瞬态字段,并且没有包含在您答案中的
所有字段列表中(虽然瞬态是,但这可能包括所有瞬态字段)。此外,解决方案中的所有字段列表中有很多多余的条目,即约束
,instanceControllersDomainBindingApi
,$defaultDatabindingWhiteList
,instanceDatabindingApi
,错误
,id
,版本
,日志
,以及instanceConvertersApi
。我不清楚为什么所有这些条目都存在,以及为什么条目瞬变
被替换为实际的瞬变字段。如果不存在更好的条目,我会用我将使用的方法更新我的问题。我想没有更好的方法可以做到这一点:(谢谢确认)。
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