Grails:嵌套的命令对象

时间:2009-12-09 18:07:49

标签: 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)
    }
}

innerCommands的相当不寻常的实例化基于this advice。但是,我发现如果我在validate()的实例上调用OuterCommand,则验证似乎不会验证包含的InnerCommand实例。

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

谢谢, 唐

2 个答案:

答案 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对象并将所有结果合并在一起,但这并不太难。