gpt4 book ai didi

grails - 自定义 Grails 验证

转载 作者:行者123 更新时间:2023-12-04 12:37:11 27 4
gpt4 key购买 nike

通常对于 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 = {
}
}

关于grails - 自定义 Grails 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com