10

在我的 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是基于这个建议。但是,我发现如果我调用validate()的实例OuterCommand,验证似乎不会验证包含的InnerCommand.

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

4

2 回答 2

9

我按照以下步骤完成了这项工作:

使内部命令对象可验证,因为它不像普通命令对象那样被实例化。有两种方法可以做到这一点,使用@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'] 
    })
}
于 2009-12-09T21:14:09.113 回答
0

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

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

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

于 2009-12-09T20:43:32.423 回答