1

该文档描述了使用磁铁模式来隐式转换为 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]))

但我只是用这个例子来要求学习一个更混乱的情况下的磁铁图案。

4

1 回答 1

2

如果作用域中存在隐式BsonTransformer[T]类型为 class BsonTransformer的实例),则存在隐式转换

  • T => CanBeBsonValueCanBeBsonValue是一个包装器BsonValue),

  • (String, T) => CanBeBsonElement(CanBeBsonElement是 的 包装器,它是andBsonElement的“元组” ),StringBsonValue

  • Iterable[(String, T)] => CanBeBsonElementsCanBeBsonElements是一个包装器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)
于 2020-11-30T06:26:06.860 回答