Grails:嵌套的命令对象

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()在最外层对象上调用时验证命令对象的整个图形?

谢谢,唐

Dón*_*nal 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'] 
    })
}
Run Code Online (Sandbox Code Playgroud)


Col*_*ton 0

我认为默认情况下不会验证命令或嵌套命令中的域对象,您必须编写一个验证器来循环遍历内部命令并验证所有命令。

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

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