Groovy方法在没有参数的情况下调用没有调用

时间:2014-09-22 12:12:51

标签: groovy

我正在使用一组Groovy包装器类来访问MongoDB。一个有效的例子是:

MyDB db = MyDB.getInstance("testdb")
DBResult res = db.users.find([:])

调用“db.users”时,methodMissing返回CollectionAccessor类的实例,该类配置为访问“users”集合。当调用find()时,CollectionAccessor的methodMissing在底层Mongo DBCollection上调用find,并执行其他有用的功能,例如将Map参数转换为所需的BasicDBObject类型。同样,DBResult存储,解释和处理诸如Mongo Write Results,游标和通过CollectionAccessor返回的对象之类的东西。

这一切都运行正常但是,我在执行测试用例时发现,在没有参数的情况下调用它时,例如:

DBResult res = db.users.find()

CollectionAccessor的methodMissing永远不会被称为“find”。返回一个CollectionAccessor实例,并抛出异常,因为尝试将其分配给DBResult类。我在调试器中跟踪它,确实看到CollectionAccessor的methodMissing for“find”仅在传递空Map参数时被调用。有没有想过为什么会这样?使用Groovy 2.3.6。

1 个答案:

答案 0 :(得分:0)

注入所有对象的

DefaultGroovyMethods已经定义find()。你必须覆盖它。

http://groovy.codehaus.org/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html#find%28java.lang.Object%29

  

public static Object find(Object self)

     

找到匹配IDENTITY Closure的第一个项目(即匹配Groovy真理)。

关于DefaultGroovyMethods

  

此类定义新的groovy方法,这些方法出现在Groovy环境中的普通JDK类中。使用静态方法,第一个参数是目标类,即public static String reverse(String self)reverse()提供String方法。