2009-12-09 113 views
9

在我的Grails应用程序我有一个包含其他命令对象的列表外命令对象:的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()时,是否可以嵌套命令对象并验证命令对象的整个图形?

谢谢, 唐

回答

0

我不认为域名在Command或嵌套命令得到默认验证对象,你会写a validator穿过innerCommands循环,并验证它们。

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

您可能需要处理Errors对象并将所有结果合并到一起,但它不是太困难。

+0

是这仍然是这样吗? – dbrin 2013-04-04 23:05:03

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'] 
    }) 
} 
+0

请参阅http://old.nabble.com/validating-nested-command-objects-td26714921.html#a26715507进行讨论。 – 2009-12-11 19:12:51

+0

这仍然是这种情况? – dbrin 2013-04-04 23:04:43