NameAndAddressのドメインクラスがあります。それぞれがミュージシャンまたはCommunityMemberになることができますが、両方であってはなりません。
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
})
}
}
ミュージシャンで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
})
Edit2 :(
コメントによって要求されたvalidateを呼び出すユニットテストコード) -
@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