【发布时间】:2013-03-14 14:26:26
【问题描述】:
在 Grails 中约束验证域对象的常用方法是在域对象中定义一个静态约束闭包,之后可以调用 myObject.validate()。
是否有可能以某种方式将应验证的内容传递给 validate 调用而不定义约束块?
我想这可以通过 Spring 验证器实例来完成,但有没有更简单的方法让您仍然拥有 Grails 的“好东西”(最大、电子邮件等)?
【问题讨论】:
标签: validation grails
在 Grails 中约束验证域对象的常用方法是在域对象中定义一个静态约束闭包,之后可以调用 myObject.validate()。
是否有可能以某种方式将应验证的内容传递给 validate 调用而不定义约束块?
我想这可以通过 Spring 验证器实例来完成,但有没有更简单的方法让您仍然拥有 Grails 的“好东西”(最大、电子邮件等)?
【问题讨论】:
标签: validation grails
您可以将字段列表传递给.validate(["fieldA", "fieldB"]),它只会验证这些字段。您仍然需要一个约束块来定义这些字段的约束。
来自 Grails 用户指南: "validate 方法接受一个可选的 List 参数,该参数包含要验证的属性的名称。当指定名称列表时,只有这些属性将被验证。"
回复@eugene82:
@Validateable
class MyDomainValidator {
String email
static constraints = {
email(email:true)
}
}
MyDomain m = new MyDomain()...
MyDomainValidator mv = new MyDomainValidator()..
mv.properties = m.properties
mv.validate()
【讨论】:
我想像这样的方法:创建一个@Validateable groovy 类,其中包含静态约束以及您需要的任何 Grails 好东西。让它像您的域一样拥有所有字段(例如,通过扩展域),并提供一种将所有字段从域实例复制到该对象的新实例的方法,例如使用构造函数。比在该课程上致电validate()。
class MyDomain {
String email
MyDomain() {}
MyDomain(email) {
email = this.email
}
}
@Validateable
class MyDomainCustomValidator extends MyDomain {
MyDomainValidator() {}
MyDomainValidator(domain) {
super(domain.email)
}
static constraints = {
email email: true
}
}
def d = new MyDomain('e@mail.com')
new MyDomainCustomValidator(d).validate()
【讨论】: