Validation 在域对象中保留Grails验证代码

Validation 在域对象中保留Grails验证代码,validation,grails,groovy,dns,Validation,Grails,Groovy,Dns,我看到的许多Grails控制器示例向您展示了如何将验证代码添加到从视图传递到视图的命令类中,如下所示: class RegisterCommand { String username String email static constraints = { username blank: false, nullable: false, validator: { value -> !User.findByUsername(v

我看到的许多Grails控制器示例向您展示了如何将验证代码添加到从视图传递到视图的命令类中,如下所示:

class RegisterCommand {
    String username
    String email

    static constraints = {
         username blank: false, nullable: false, validator: { value ->
             !User.findByUsername(value) }

         email blank: false, nullable: false, email: true
    }
}
这很好,但如果我们需要在另一个控制器中验证用户,可能会导致代码重复。Grails为您提供了从域类导入验证规则的选项,如下所示-

static constraints = {
    importFrom User
}
这里,我的验证规则是从我的
User
类中提取出来的

这对DYR原则很有帮助,但是如果我想有条件地从域类导入验证规则呢?例如,我只想验证表单上的地址字段,如果有人选中了表单上的一个框,表示他们希望通过邮寄方式收到小册子。我已经尝试了几个关于这个主题的变体,但我似乎无法让它工作。。。这可能吗

static constraints = {
    importFrom User
    addressCheckbox validator: { value, command -> 
        if (value) {
            importFrom Address
        }
    }
}

我认为它不起作用,因为
importFrom
在编译时适用于约束生成器层,但您的验证器闭包在运行时的验证阶段调用
importFrom

好的,谢谢您的澄清。在这种情况下,在Grails中组织验证代码的最佳实践是什么?请看RichDomains插件,它使您能够外部化并有选择地验证域类-