Я пытаюсь добавить некоторые методы Groovy-er в классы MongoCollection
и FindIterable
Монго.
Если я добавлю методы через ExpandoMetaClass
, все будет работать нормально:
// add convenience methods to MongoCollection, and FindIterable to make it more groovy friendly.
// Usage: `collection.find(partnerId: 2).each { ... }`
// or: `collection.find([partnerId: 2]).each { ... }`
MongoCollection.metaClass.find << { Map filter ->
return find((Bson) new Document(filter))
}
// Usage: `collection.find().projection(_id: 0, Rid: 1, DeliveryPartnerId: 1).each { ... }`
FindIterable.metaClass.projection << { Map fields ->
return projection((Bson) new Document(fields))
}
Однако, когда я пытаюсь добавить методы через Модуль расширения :
<code>/**
* Adds Groovy Map friendly extension methods to MongoCollection and FindIterable.
*/
class GroovyMongoExtensions {
/**
* Makes it easy to call the find method on a MongoCollection with a Map, or Map parameters.
* Example:
* <pre>collection.find(group: 10).each { ... }
* или же:
*
collection.find([group: 10]).each { ... }
* /
статическая FindIterable find (MongoCollection self, фильтр карты) {
return self.find ((Bson) новый документ (фильтр))
}
/ **
* Упрощает вызов метода проекции для FindIterable с параметрами Map или Map.
* Пример:
*
collection.find().projection(myId: 1, name: 1).each { ... }
* /
статическая проекция FindIterable (FindIterable self, поля Map) {
вернуть self.projection ((Bson) новый документ (поля))
}
}
Я получаю эту ошибку:
Exception in thread "main" groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method com.mongodb.client.internal.MongoCollectionImpl#find.
Cannot resolve which method to invoke for [class org.bson.Document] due to overlapping prototypes between:
[interface org.bson.conversions.Bson]
[interface java.util.Map]
Я получил ошибку от ExpandoMetaClass
метода, но добавление явного приведения к (Bson)
решило ее в этом случае.