Grails:嵌套的命令对象

Grails:嵌套的命令对象,grails,groovy,grails-validation,command-objects,Grails,Groovy,Grails Validation,Command Objects,在我的grails应用程序中,我有一个外部命令对象,其中包含其他命令对象的列表: public class OuterCommand { List<InnerCommand> innerCommands = ListUtils.lazyList([], FactoryUtils.instantiateFactory(InnerCommand)) } class InnerCommand { String code Long id String va

在我的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)
    }
}
公共类外部命令{
List innerCommands=ListUtils.lazyList([],FactoryUtils.InstanceFactory(InnerCommand))
}
类InnerCommand{
字符串代码
长id
字符串值
静态约束={
代码(可为空:false,空白:false)
值(可为空:false,空白:false)
}
}
innerCommands
的非常不寻常的实例化基于。但是,我发现如果我对
OuterCommand
的实例调用
validate()
,验证似乎不会验证所包含的
InnerCommand
实例


当在最外层的对象上调用
validate()
时,是否可以嵌套命令对象并验证整个命令对象图?

我不认为嵌套命令中的域对象在默认情况下会得到验证,您必须编写循环以通过innerCommand并验证它们

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

您可能需要处理Errors对象并将其与所有结果合并在一起,但这并不太困难。

我通过以下步骤实现了这一点:

使内部命令对象可验证,因为它不像普通命令对象那样被实例化。有两种方法可以做到这一点,使用
@org.codehaus.groovy.grails.validation.Validateable
注释,或者使用grails配置参数
grails.Validateable.classes

将InnerCommand的自定义验证程序添加到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'] 
    })
}
请参阅以进行讨论。