如何在Grails中的单个域类中使用多组约束?

时间:2011-09-23 08:11:52

标签: grails gorm

我需要在节省时间选择一组验证规则。理想情况下,我希望能够在域类中定义多个约束集:

class Account {
    ...
    static constraints = { ... }
    static constraints2 = { ... }
}    

我知道我可以在代码中进行自己的验证(account.errors.rejectValue(...)等)但是我希望尽可能使用内置的Grails验证来节省一些时间。

2 个答案:

答案 0 :(得分:2)

这是Command Objects的用途。

您不能只交换验证的原因是验证还有助于定义数据库结构,例如将字段设置为非空,或非空,或具有特定长度。例如,关闭“非null”可能会破坏数据库结构。

另一方面,命令对象是designed to have their own unique set of validation rules。这不是最干净的方法(现在你在不止一种情况下跟踪相同的结构),但它在很多方面都更好。

  • 它允许您安全地接受输入参数,而不必担心会设置不应处理的内容。
  • 它创建了更清晰的控制器,因为验证逻辑都可以在命令对象中处理,而不是通过控制器方法进行处理。
  • 它们允许您验证对象上实际不存在的属性(例如密码验证字段)。

如果您认为您确实需要多组约束,那么您很可能 a)过度复杂化域对象以表示比实际应该更多的信息(可能会将其分解为多个对一个相关对象),或 b)首先错误地设置约束。†

根据我的经验,当你觉得需要换掉约束时,通常会发生 a


†据说,它可以(很少)有意义。但在这种情况下,Command对象是最佳解决方案。

答案 1 :(得分:1)

您可以使用验证器约束,请参阅:http://www.grails.org/doc/latest/ref/Constraints/validator.html

在一个验证器约束中,您可以执行多于一个的检查并返回不同的错误代码,例如

static constaints = {
    name: validator { value, obj ->
             if (value.size() > 10)
                  return [invalid.length]
             else if (value.contains("test"))
                  return [invalid.content]
             return true
   }
在message.properties中

domainClass.propName.invalid.content = ...

}