10

私のgrailsアプリには、他のコマンドオブジェクトのリストを含む外部コマンドオブジェクトがあります。

public class OuterCommand {

    List<InnerCommand> innerCommands = ListUtils.lazyList([], FactoryUtils.instantiateFactory(InnerCommand))
}

class InnerCommand {
    String code
    Long id
    String value

    static constraints = {
        code(nullable: false, blank: false)
        value(nullable: false, blank: false)
    }
}

のかなり珍しいインスタンス化は、このアドバイスinnerCommandsに基づいています。ただし、のインスタンスを呼び出すと、検証はに含まれているのインスタンスを検証していないように見えることがわかりました。validate()OuterCommandInnerCommand

validate()コマンドオブジェクトをネストし、最も外側のオブジェクトでが呼び出されたときにコマンドオブジェクトのグラフ全体を検証することは可能ですか?

4

2 に答える 2

9

次の手順に従って、これを機能させました。

通常のコマンド オブジェクトのようにインスタンス化されないため、内部コマンド オブジェクトを有効にします。@org.codehaus.groovy.grails.validation.Validateableこれを行うには、アノテーションを使用する方法と、grails 構成パラメーターを使用する方法の 2 つがあります。grails.validateable.classes

innerCommands のカスタム バリデーターを OuterCommand に追加する

static constraints = {
    innerCommands(validator: {val, obj ->
        // 'attributes.validation.failed' is the key for the message that will
        // be shown if validation of innerCommands fails
        return val.every { it.validate() } ?: ['attributes.validation.failed'] 
    })
}
于 2009-12-09T21:14:09.113 に答える
0

コマンドまたはネストされたコマンドのドメインオブジェクトがデフォルトで検証されるとは思わない.innerCommandsをループしてそれらすべてを検証するバリデーターを書く必要がある.

static constraints = {
    innerCommands(validator:{val,obj ->
        //validate and merge errors from each innerCommand
    })
}

おそらく、Errors オブジェクトを処理してすべての結果をマージする必要がありますが、それほど難しくありません。

于 2009-12-09T20:43:32.423 に答える