#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)