代码之家  ›  专栏  ›  技术社区  ›  Dónal

grails:嵌套命令对象

  •  9
  • Dónal  · 技术社区  · 15 年前

    在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 .

    有效() 在最外层的对象上调用?

    谢谢, 唐

    2 回复  |  直到 12 年前
        1
  •  8
  •   Dónal    15 年前

    我通过以下步骤来完成这项工作:

    使内部命令对象可验证,因为它不像普通命令对象那样被实例化。有两种方法可以做到这一点 @org.codehaus.groovy.grails.validation.Validateable 注释,或者使用grails config参数 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
  •  0
  •   Colin Harrington    15 年前

    我不认为 Command 或者嵌套命令在默认情况下得到验证,则必须编写 a validator 循环内部命令并验证所有命令。

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

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

    推荐文章