5

我正在尝试让 grails 验证对象列表的内容,如果我先显示代码可能会更容易:

class Item {
  Contact recipient = new Contact()
  List extraRecipients = [] 

  static hasMany = [
          extraRecipients:Contact
  ]

  static constraints = {}

  static embedded = ['recipient']
}

class Contact {
  String name
  String email

  static constraints = {
    name(blank:false)
    email(email:true, blank:false)
  }
}    

基本上我所拥有的是一个必需的联系人('收件人'),这很好用:

def i = new Item()
// will be false
assert !i.validate() 
// will contain a error for 'recipient.name' and 'recipient.email'
i.errors 

我还想要验证Contact“extraRecipients”中的任何附加对象,例如:

def i = new Item()
i.recipient = new Contact(name:'a name',email:'email@example.com')

// should be true as all the contact's are valid
assert i.validate() 

i.extraRecipients << new Contact() // empty invalid object

// should now fail validation
assert !i.validate()

这是可能的还是我只需要遍历我的控制器中的集合并调用validate()每个对象extraRecipients

4

1 回答 1

10

如果我正确理解了这个问题,您希望错误出现在 Item 域对象上(作为 extraRecipients 属性的错误,而不是让级联保存在 extraRecipients 中的各个联系人项目上引发验证错误,对吗?

如果是这样,您可以在 Item 约束中使用自定义验证器。像这样的东西(这还没有经过测试,但应该很接近):

static constraints = {
    extraRecipients( validator: { recipients ->
        recipients.every { it.validate() } 
    } )
}

您可以比错误消息更有趣,以潜在地在生成的错误字符串中表示哪个收件人失败,但这是执行此操作的基本方法。

于 2009-06-24T22:56:44.263 回答