我有一个限制,所以不能超过
存储了ConfigurationHolder.config.support.reminder.web.person.max
个对象。
我没有找到如何添加与特定属性无关的验证器。所以现在我以这种方式实现它。你们有什么想法让它变得更好吗?
package support.reminder.web
import org.codehaus.groovy.grails.commons.ConfigurationHolder;
class Person {
String firstName
String lastName
String email
Date lastDutyDate
static constraints = {
firstName(blank: false)
lastName(blank: false)
email(blank: false, email: true)
lastDutyDate(nullable: true)
id validator: {val ->
if (val)
Person.count() <= ConfigurationHolder.config.support.reminder.web.person.max
else
Person.count() < ConfigurationHolder.config.support.reminder.web.person.max
}
}
String toString() {
"[$firstName $lastName, $email, $lastDutyDate]"
}
}
答案 0 :(得分:5)
您可以使用Grails Custom Constraints Plugin来管理验证实施。然后,您可以像预定义的Grails约束一样调用自己的约束:
package support.reminder.web
import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH
class Person {
String firstName
String lastName
String email
Date lastDutyDate
static constraints = {
firstName(blank: false)
lastName(blank: false)
email(blank: false, email: true)
lastDutyDate(nullable: true)
id(maxRows: CH.config.support.reminder.web.person.max)
}
}
或者,如果您不想依赖第三方插件,您可以在Service方法中实现自定义验证器的逻辑,但可以从域中的自定义验证器调用它:
package support.reminder.web
import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH
class Person {
def validationService
String firstName
String lastName
String email
Date lastDutyDate
static constraints = {
firstName(blank: false)
lastName(blank: false)
email(blank: false, email: true)
lastDutyDate(nullable: true)
id (validator: {val ->
validationService.validateMaxRows(val, CH.config.support.reminder.web.person.max)
}
}
}
答案 1 :(得分:0)
我没有更好的主意,但我确实建议您可能需要检查&lt;不是&lt; =。我认为在验证您的对象时,它尚未存储在DB中,因此它不会包含在Person.count()中。我认为&lt; =会导致它通过验证然后被保存,那么你就会违反规则。
答案 2 :(得分:0)
我建议您使用服务功能,例如personService.addPerson()。然后在保存新对象之前检查约束。如果您获得更复杂的约束,例如当它涉及许多域对象时,它将受益。
如果关于验证器的含义,使用验证器来限制对象的数量实际上并不是很好:对象有效,只有对象的数量太大。
简而言之:逻辑代码转到服务。