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

如何在Grails中的单个域类上使用多组约束?,grails,gorm,Grails,Gorm,我需要在节省时间时选择一组验证规则。理想情况下,我希望能够在域类中定义多组约束: class Account { ... static constraints = { ... } static constraints2 = { ... } } 我知道我可以用代码(account.errors.rejectValue(…)等)进行自己的验证,但如果可能的话,我希望通过使用内置的Grails验证来节省一些时间。您可以使用validator约束,请参阅: 在一个验证器

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

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

我知道我可以用代码(account.errors.rejectValue(…)等)进行自己的验证,但如果可能的话,我希望通过使用内置的Grails验证来节省一些时间。

您可以使用validator约束,请参阅:

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

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 = ...
}这就是我们的目的

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

另一方面,命令对象是。这不是最干净的方法(现在您正在不止一种情况下跟踪相同的结构),但它在很多方面都更好

  • 它允许您安全地接受输入参数,而不必担心设置了不应处理的内容
  • 它创建了更干净的控制器,因为验证逻辑都可以在命令对象中处理,而不是通过控制器方法进行处理
  • 它们允许您验证对象上实际不存在的属性(例如密码验证字段)
如果您认为确实需要多组约束,则最有可能的情况是a)使域对象过于复杂,以表示超出其实际需要的更多信息(可能将其分解为多个一对一的相关对象),或者b)首先错误设置约束。†

根据我的经验,通常情况下,当您觉得需要交换约束时会发生这种情况



†尽管如此,它(很少)是有意义的。但在这种情况下,命令对象是最好的解决方案。

这不是我想要的。我有一堆约束(每个约束在不同的字段上),有时我需要检查所有约束,有时我只需要检查一个子集。