【问题标题】:Grails: nested command objectsGrails:嵌套的命令对象
【发布时间】: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() 在最外层的对象上被调用时,是否可以嵌套命令对象并验证整个命令对象图?

【问题讨论】:

    标签: grails groovy grails-validation command-objects


    【解决方案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'] 
        })
    }
    

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2019-08-10
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多