Пользовательский валидатор Grails для класса домена
У меня есть ограничение, поэтому не может быть больше, чем 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]"
}
}
3 ответа
Вы можете использовать плагин Grails Custom Constraints для управления вашей реализацией валидации. Затем вы можете вызвать собственное ограничение, как и предопределенные ограничения 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)
}
}
}
У меня нет лучшей идеи, но я предлагаю вам проверить, нет ли <не <=. Я думаю, что при проверке вашего объекта он еще не был сохранен в БД, поэтому он не будет включен в Person.count (). Я считаю, что <= заставит его пройти проверку, а затем будет сохранен, тогда вы нарушите правило.
Я рекомендую вам использовать сервисную функцию, например, personService.addPerson(). Затем проверьте ограничение перед сохранением нового объекта. Будет полезно, если вы получите более сложное ограничение, например, когда оно связано со многими объектами домена, например.
Использование валидатора для ограничения количества объектов на самом деле не очень хорошо, если речь идет о значении валидатора: объект действителен, только число объектов слишком велико.
Короче говоря: логический код идет в сервис.