Шаблон магнита для драйвера Scala MongoDB

#mongodb #scala #implicit #scala-macros #mongo-scala-driver

#mongodb #scala #неявный #scala-макросы #mongo-scala-driver

Вопрос:

В документации описывается использование шаблона magnet для получения неявного преобразования в типы BSON. Смотрите на этой странице http://mongodb.github.io/mongo-java-driver/4.1/driver-scala/bson/scala-documents /. Я попытался определить неявный объект, который расширяет BsonTransformer, но ему не удается найти кодек для этого типа. Я что-то упускаю / у кого-нибудь это работает? В приведенном ниже примере кода предполагается, что вызывается метод insert.

 case class CustomType(specialString: String)

implicit object TransformCustomType extends BsonTransformer[CustomType] {

  def apply(value: CustomType): BsonString = 
      BsonString(value.specialString)
}

lazy val db: MongoDatabase = client.getDatabase(dbName).withCodecRegistry(DEFAULT_CODEC_REGISTRY)
lazy val testCollection: MongoCollection[CustomType] = db.getCollection[CustomType](collectionName)

def insert: Future[Completed] = testCollection.insertOne(CustomType("a")).toFuture

  

Ошибка —
org.bson.codecs.configuration.Исключение CodecConfigurationException: не удается найти кодек для класса com.bla.BlaClass$CustomType.

* обратите внимание, что я знаю, что это можно сделать с помощью

 val codecRegistry = fromRegistries(fromProviders(classOf[CustomType]))
  

но я просто использую этот пример, чтобы попросить изучить шаблон магнита для более сложного случая.

Комментарии:

1. Можете ли вы указать ошибку и код, в котором вы используете этот кодировщик?

2. спасибо, добавлен пример и ошибка @EmiCareOfCell44

3. Этот код компилируется с драйвером mongo scala 4.1.1. Какую версию драйвера Scala / mongo вы используете?

4. Сбой во время выполнения. драйвер 4.0.1

Ответ №1:

Если в области видимости есть неявный BsonTransformer[T] (экземпляр класса типа BsonTransformer ), то существуют неявные преобразования

  • T => CanBeBsonValue ( CanBeBsonValue закончена ли оболочка BsonValue ),

  • (String, T) => CanBeBsonElement ( CanBeBsonElement является оболочкой BsonElement , которая является «кортежем» String и BsonValue ),

  • Iterable[(String, T)] => CanBeBsonElements ( CanBeBsonElements закончена ли оболочка Iterable[BsonElement] )

определены в BsonMagnets ( CanBeBsonValue , CanBeBsonElement , CanBeBsonElements являются магнитами 1 2).

Затем Document может быть создан с помощью заводских методов

 def apply(elems: CanBeBsonElement*): Document

def apply(elem: CanBeBsonElements): Document
  

Так что попробуйте

 val doc = Document("a" -> CustomType("bb"))

val testCollection: MongoCollection[Document] = ???

testCollection.insertOne(doc)