Grails:嵌套的命令对象
在我的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
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']
})
}
请参阅以进行讨论。