2009-12-09 117 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