1

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
4

1 に答える 1

0

コメントでSudhirが回答しました。Domain クラス名に "And" (または、おそらく任意の述語) があると、Grails の奇妙な小さな findByThenPutVariablesInTheMethodName 構文が台無しになります

クラスの名前を NameAddress に変更すると、すべてがうまくいきました。

これを行う人への特別な警告として、DomainClass.findByWhatever を含む単体テストを実行するときは、必ず Grails の mockDomain クラスを使用してください。例を質問の一番下に置きます

于 2012-06-02T04:58:31.167 に答える