自定义Grails验证



通常对于Grails域或命令类,您声明约束,框架会添加一个validate()方法来检查这些约束是否对当前实例有效,例如

class Adult {
  String name
  Integer age
  void preValidate() { 
    // Implementation omitted
  }
  static constraints = {
    name(blank: false)
    age(min: 18)
  }
}
def p = new Person(name: 'bob', age: 21)
p.validate()

在我的例子中,我想确保preValidate总是在类验证之前执行。我可以通过添加

方法来实现这一点
def customValidate() {
  preValidate()
  validate()
}

但是每个使用这个类的人都需要记住调用customValidate而不是validate。我也不能这样做

def validate() {
  preValidate()
  super.validate()
}

因为validate不是父类的方法(它是通过元编程添加的)。有没有别的方法可以达到我的目标?

当您的域/命令类具有preValidate()方法时,您应该能够通过在元类上使用您自己的validate版本来完成此操作。类似于BootStrap.groovy中的以下代码可以为您工作:

class BootStrap {
    def grailsApplication   // Set via dependency injection
    def init = { servletContext ->
        for (artefactClass in grailsApplication.allArtefacts) {
            def origValidate = artefactClass.metaClass.getMetaMethod('validate', [] as Class[])
            if (!origValidate) {
                continue
            }
            def preValidateMethod = artefactClass.metaClass.getMetaMethod('preValidate', [] as Class[])
            if (!preValidateMethod) {
                continue
            }
            artefactClass.metaClass.validate = {
                preValidateMethod.invoke(delegate)
                origValidate.invoke(delegate)
            }
        }
    }
    def destroy = {
    }
}

您可以使用beforeValidate()事件来实现您的目标。

相关内容

  • 没有找到相关文章

最新更新