开发者

Grails: nested command objects

In my grails app I have an outer command object that contains a list of other command objects:

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

The rather unusual instantiation of innerCommands 开发者_StackOverflowis based on this advice. However, I find that if I call validate() on an instance of OuterCommand, the validation does not seem to validate the contained instances of InnerCommand.

Is it possible to nest command objects and have the entire graph of command objects validated when validate() is called on the outermost object?


I got this working by following these steps:

Make the inner command object validatable since it is not getting instantiated like a normal command object. There are two ways to do this, with the @org.codehaus.groovy.grails.validation.Validateable annotation, or with the grails config parameter grails.validateable.classes

Adding a custom validator for innerCommands to 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'] 
    })
}


I don't think that Domain Objects in a Command or nested Commands get validated by default, you would have to write a validator that loops through the innerCommands and validates them all.

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

You'll probably have to handle the Errors object and merge it all the results together, but its not too difficult.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜