用于域类的Grails自定义验证器

Ale*_*sey 3 grails grails-validation grails-domain-class

我有一个限制,所以只能 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]"
    }
}
Run Code Online (Sandbox Code Playgroud)

dav*_*vid 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想依赖第三方插件,则可以在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)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)