我需要在节省时间选择一组验证规则。理想情况下,我希望能够在域类中定义多个约束集:
class Account {
...
static constraints = { ... }
static constraints2 = { ... }
}
我知道我可以在代码中进行自己的验证(account.errors.rejectValue(...)等)但是我希望尽可能使用内置的Grails验证来节省一些时间。
答案 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 = ...
}