Пользовательский валидатор 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(). Затем проверьте ограничение перед сохранением нового объекта. Будет полезно, если вы получите более сложное ограничение, например, когда оно связано со многими объектами домена, например.

Использование валидатора для ограничения количества объектов на самом деле не очень хорошо, если речь идет о значении валидатора: объект действителен, только число объектов слишком велико.

Короче говоря: логический код идет в сервис.

Другие вопросы по тегам