2009-12-09 15 views
9

Dans mon app Grails j'ai un objet de commande externe qui contient une liste d'autres objets de commande:Grails: objets de commande imbriqués

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

L'instanciation plutôt inhabituel de innerCommands est basé sur this advice. Cependant, je trouve que si j'appelle validate() sur une instance de OuterCommand, la validation ne semble pas valider les instances contenues de InnerCommand.

Est-il possible d'imbriquer des objets de commande et d'avoir le graphe entier des objets de commande validé lorsque validate() est appelée sur l'objet le plus externe?

Merci, Don

Répondre

0

Je ne pense pas que les objets de domaine dans un Command ou des commandes imbriquées se validées par défaut, vous devez écrire a validator qui boucle à travers les innerCommands et les valide tous. Vous devrez probablement gérer l'objet Errors et fusionner tous les résultats ensemble, mais ce n'est pas trop difficile.

+0

est-ce encore le cas? – dbrin

8

J'ai eu ce travail en suivant ces étapes:

Faire l'objet de commande intérieure validable car il ne reçoit pas instancié comme un objet de commande normale. Il y a deux façons de le faire, avec l'annotation @org.codehaus.groovy.grails.validation.Validateable, ou avec le Grails paramètre config grails.validateable.classes

Ajout d'un validateur personnalisé pour 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

Voir http://old.nabble.com/validating-nested-command-objects-td26714921.html#a26715507 pour une discussion. –

+0

est-ce toujours le cas? – dbrin