Dón*_*nal 9 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 value
static constraints = {
code(nullable: false, blank: false)
value(nullable: false, blank: false)
}
}
Run Code Online (Sandbox Code Playgroud)
相当不寻常的实例化innerCommands是基于这个建议.但是,我发现如果我调用validate()一个实例OuterCommand,验证似乎不会验证包含的实例InnerCommand.
是否可以嵌套命令对象并validate()在最外层对象上调用时验证命令对象的整个图形?
谢谢,唐
我通过以下步骤完成了这项工作:
使内部命令对象可以有效,因为它没有像普通命令对象那样被实例化.有两种方法可以使用@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']
})
}
Run Code Online (Sandbox Code Playgroud)
我认为默认情况下不会验证命令或嵌套命令中的域对象,您必须编写一个验证器来循环遍历内部命令并验证所有命令。
static constraints = {
innerCommands(validator:{val,obj ->
//validate and merge errors from each innerCommand
})
}
Run Code Online (Sandbox Code Playgroud)
您可能必须处理 Errors 对象并将其所有结果合并在一起,但这并不太困难。
| 归档时间: |
|
| 查看次数: |
4444 次 |
| 最近记录: |