我的验证问题与此处描述的非常相似
https://schneide.wordpress.com/2010/09/20/gorm-gotchas-validation-and-hasmany/
但是我的域名中没有(或想要)List<Element> elements
字段的重要区别。我的代码是
class Location {
static hasMany = [pocs: LocationPoc]
Integer id
String address
String city
State state
String zip
...
static mapping = {
...
}
static constraints = {
def regEx = new RegEx()
address blank: true, nullable: true, matches: regEx.VALID_ADDRESS_REGEX
city blank: true, nullable: true
state blank: true, nullable: true
zip blank: true, nullable: true
...
}
}
但是,如果我使用双层POC(联系点)保存/更新位置,我会遇到一些错误。我想在保存/更新位置时验证POC,但我不确定如何。我尝试了一些
的变种pocs validator: {
obj -> obj?.pocs?.each {
if (!it.validate()) {
return false
}
}
return true
}
无济于事。如果没有在我的域List<LocationPoc> pocs
上创建新字段,这是否可能?
答案 0 :(得分:1)
你很亲密。问题是您需要定位要验证的属性而不是使用对象引用。它应该是这样的:
pocs validator: { val, obj, err ->
val?.each {
if (!it.validate()) return false
}
}
答案 1 :(得分:0)
验证不会自动通过hasMany关联级联。为了获得免费验证,关系的另一方需要属于Location。
您没有包含您的LocationPOC课程,但是如果您修改了
Location location
到
static belongsTo = [location: Location]
然后,当您保存Location对象时,您将获得级联验证。
如果您无法在LocationPoc上设置belongsTo属性,并且需要使用自定义验证程序,则语法与上面的答案略有不同。
pocs validator: {val, obj ->
val?.inject true, {acc,item -> acc && item.validate()}
}
validate的三个争论版本希望您向errorCollection添加错误。 https://grails.github.io/grails2-doc/2.5.6/ref/Constraints/validator.html
另外,使用.each
内部的return语句并不像上面的示例那样工作。它只是退出闭包并开始下一次迭代。来自另一个答案的验证器只是返回val(val.each的结果只是val)
您需要遍历整个集合,寻找无效的选项。