我正在使用一组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。
答案 0 :(得分:0)
DefaultGroovyMethods
已经定义find()
。你必须覆盖它。
public static Object find(Object self)
找到匹配
IDENTITY
Closure的第一个项目(即匹配Groovy真理)。
关于DefaultGroovyMethods
:
此类定义新的groovy方法,这些方法出现在Groovy环境中的普通JDK类中。使用静态方法,第一个参数是目标类,即
public static String reverse(String self)
为reverse()
提供String
方法。