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