Dón*_*nal 7 grails groovy grails-validation
通常对于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()
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我想确保preValidate
在验证类之前始终执行.我可以通过添加方法来实现这一点
def customValidate() {
preValidate()
validate()
}
Run Code Online (Sandbox Code Playgroud)
但是那些使用这个课程的人都需要记得打电话customValidate
而不是validate
.我也不能这样做
def validate() {
preValidate()
super.validate()
}
Run Code Online (Sandbox Code Playgroud)
因为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 = {
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1481 次 |
最近记录: |