validationgroovycommand-objects

Groovy 2.4.4 command objects - reusing validator closure


Let's saying I have the following command:

@Validateable
class MyCommand {
    String cancel_url
    String redirect_url
    String success_url

    static constraints = {
        cancel_url nullable: false, validator: { url, obj ->
            //some specific validation
            //some common url validation
        }
        redirect_url nullable: false, validator: { url, obj ->
            //some specific validation
            //some common url validation
        }
        success_url nullable: false, validator: { url, obj ->
            //some specific validation
            //some common url validation
        }
    }
}

Let's say I have some common validation I want to perform on any URL field (for instance, checking that the domain is allowed). What's the syntax to break this common validation code into a separate function instead of putting the same block in each validation closure?


Solution

  • Did you try to inherit (or let's say implement) your command from several traits?

    Trait CancelComponentCommand {
        String cancelUrl
    
        static constraints = {
            cancelUrl validator: { url, obj ->
                //some specific validation
                //some common url validation
            }
        }
    }
    
    Trait RedirectComponenCommand {
        String redirectUrl
    
        static constraints = {
                redirectUrl validator: { url, obj ->
                //some specific validation
                //some common url validation
            }
        }
    }
    
    @Validateable
    class MyCommand implements CancelComponentCommand, RedirectComponenCommand {
    
    }
    

    PS There is no need to set nullable: false, it's false by default. Also the code is much more readable if fields are written using camelCase.