我有一个 NameAndAddress 域类。每个人都可以是音乐家或社区成员,但不应两者兼而有之。
class NameAndAddress {
...
}
class Musician {
NameAndAddress nameAndAddress
}
class CommunityMember {
NameAndAddress nameAndAddress
}
我想为它们添加一个验证器,检查上述规则。我从音乐家开始:
class Musician {
NameAndAddress nameAndAddress
static constraints = {
nameAndAddress(validator: { thisField ->
return (CommunityMember.findByNameAndAddress(thisField) == null) ? true : false
})
}
}
当我在 Musician 上运行 validate() 时,虽然我得到:
groovy.lang.MissingMethodException: No signature of method: CommunityMember.findByNameAndAddress() is applicable for argument types: (NameAndAddress) values: [NameAndAddress : 1]
Possible solutions: findByNameAndAddress([Ljava.lang.Object;)
我不明白这个错误。不是说 NameAndAddress 对象对期望的东西无效吗... NameAndAddress 对象?
我该怎么做才能让它工作?
编辑:(
解决方法) - 使用上述方法仍然无法正常工作。我有一个丑陋的解决方法,@sudhir 指出会影响性能。但是,如果它可以帮助人们以更清洁的方式理解我正在尝试做的事情,则此代码确实有效:
nameAndAddress(validator: { thisField, thisObject ->
boolean notACommunityMember = true
for (CommunityMember communityMember : CommunityMember.list()) {
if (communityMember.getNameAndAddress().getId() == thisField.getId()) {
notACommunityMember = false
break
}
}
return notACommunityMember
})
编辑2:(
单元测试代码调用验证,由评论请求) -
@TestMixin(DomainClassUnitTestMixin)
class MusicianTest ...
NameAndAddress aNameAndAddress = new NameAndAddress()
mockDomain(CommunityMember, [
[nameAndAddress: aNameAndAddress]
])
Musician musician = new Musician(nameAndAddress: aNameAndAddress)
musician.validate()
assert musician.errors["nameAndAddress"] != null