2009-12-09 4 views
9

In meiner Grails App habe ich einen äußeren Befehl Objekt, das eine Liste von anderen Befehlsobjekte enthält:Grails: verschachtelten Befehlsobjekte

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) 
    } 
} 

Die eher ungewöhnliche Instanziierung innerCommands auf this advice basiert. Ich finde jedoch, wenn ich validate() auf einer Instanz von OuterCommand aufrufen, scheint die Validierung nicht die enthaltenen Instanzen von InnerCommand zu validieren.

Ist es möglich, Befehlsobjekte zu verschachteln und das gesamte Diagramm der Befehlsobjekte zu validieren, wenn validate() für das äußerste Objekt aufgerufen wird?

Danke, Don

Antwort

0

Ich glaube nicht, dass Domain-Objekte in einer Command oder verschachtelte Befehle erhalten standardmäßig überprüft, würden Sie schreiben müssen a validator, die die innerCommands Schleifen durch und überprüft sie alle.

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

Wahrscheinlich müssen Sie das Errors-Objekt behandeln und alle Ergebnisse zusammenführen, aber es ist nicht allzu schwierig.

+0

dies immer noch der Fall ist? – dbrin

8

bekam ich diese Arbeit mit den folgenden Schritten:

Machen Sie den inneren Befehl Objekt validierbares da es nicht wie ein normaler Befehl Objekt instanziiert zu werden. Es gibt zwei Möglichkeiten, dies zu tun, mit der @org.codehaus.groovy.grails.validation.Validateable Anmerkung oder mit der Config grails Parametern grails.validateable.classes

einen benutzerdefinierten Validator für innerCommands Hinzufügen 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

Siehe http://old.nabble.com/validating-nested-command-objects-td26714921.html#a26715507 zur Diskussion. –

+0

ist das immer noch der Fall? – dbrin