Grails:嵌套的命令对象

Posted

技术标签:

【中文标题】Grails:嵌套的命令对象【英文标题】:Grails: nested command objects 【发布时间】:2010-12-24 22:44:11 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

请参阅old.nabble.com/… 进行讨论。【参考方案2】:

我不认为 Command 或嵌套命令中的域对象默认得到验证,您必须编写 a validator 循环遍历 innerCommands 并验证它们。

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

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

【讨论】:

以上是关于Grails:嵌套的命令对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 groovy/grails 中为嵌套对象创建标准?

Grails:普通类和命令对象之间的区别?

Grails 命令对象数据绑定

Grails 命令对象可以有可变数量的参数吗?

Grails:如何使用命令对象验证由项目列表组成的 POST 正文?

Grails 命令对象:如何将 request.JSON 加载到其中?