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 is 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']
})
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With