Grails:如何检查是否已将字段验证添加到其他Domain类?

时间:2012-05-31 02:23:12

标签: grails groovy junit validation missingmethodexception

我有一个NameAndAddress的Domain类。每个人都可以是音乐家或社区成员,但不应该是两者。

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:
(单元测试代码调用验证,由评论请求) -

@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

1 个答案:

答案 0 :(得分:0)

Sudhir在评论中回答。在域类名称中使用“和”(或假设,任何谓词)将搞乱Grails的奇怪的小findByThenPutVariablesInTheMethodName语法

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

作为执行此操作的任何人,请务必在进行涉及DomainClass.findByWhatever的单元测试时使用Grails的mockDomain类。我把我的例子放在问题的最底层