3

次の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 の方法がないことを確認したかったのです。

アップデート

「グルーヴィーな」方法がない場合、これを行う方法を次に示します。

    // 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
    }
4

2 に答える 2

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

検証のために除外されたフィールドのリストを直接送信する方法はありません。

于 2013-08-22T00:38:51.477 に答える