Groovy модули расширения против дополнений ExpandoMetaClass - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь добавить некоторые методы 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) решило ее в этом случае.

...