在我的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
的相当不寻常的实例化基于this advice。但是,我发现如果我在validate()
的实例上调用OuterCommand
,则验证似乎不会验证包含的InnerCommand
实例。
是否可以嵌套命令对象并在最外层对象上调用validate()
时验证整个命令对象图?
谢谢, 唐
答案 0 :(得分:8)
我按照以下步骤完成了这项工作:
使内部命令对象可以有效,因为它没有像普通命令对象那样被实例化。有两种方法可以使用@org.codehaus.groovy.grails.validation.Validateable
注释或使用grails配置参数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']
})
}
答案 1 :(得分:0)
我不认为Command或嵌套命令中的域对象默认情况下会被验证,您必须编写a validator循环内部命令并验证它们。
static constraints = {
innerCommands(validator:{val,obj ->
//validate and merge errors from each innerCommand
})
}
您可能必须处理Errors对象并将所有结果合并在一起,但这并不太难。