1

我有一个 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
4

1 回答 1

0

Sudhir 在评论中回答。在 Domain 类名中包含“And”(或者假设是任何谓词)将搞砸 Grails 奇怪的小 findByThenPutVariablesInTheMethodName 语法

将类重命名为 NameAddress,一切顺利。

作为对任何这样做的人的额外提醒,在进行涉及 DomainClass.findByWhatever 的单元测试时,请务必使用 Grails 的 mockDomain 类。我把我的例子放在问题的最底部

于 2012-06-02T04:58:31.167 回答