3

我有一个限制,所以只能 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]"
    }
}
4

3 回答 3

5

您可以使用Grails 自定义约束插件来管理您的验证实现。然后你可以像预定义的 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)
    }

}

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

}
于 2011-01-28T07:22:50.900 回答
0

我没有更好的主意,但我确实建议您可能需要检查 < 而不是 <=。我认为在验证您的对象时,它尚未存储在数据库中,因此不会包含在 Person.count() 中。我认为 <= 会导致它通过验证然后被保存,那么你就会违反规则。

于 2011-01-19T08:40:24.053 回答
0

我建议您使用服务函数,例如 personService.addPerson()。然后在保存新对象之前检查约束。如果您获得更复杂的约束,例如当它与许多域对象相关时,它将受益。

使用validator来限制对象的数量其实不太好考虑validator的含义:对象是合法的,只是对象的数量太大了。

简而言之:逻辑代码进入服务。

于 2011-01-20T03:09:50.727 回答