scala和mongodb:pojo和scala类

5jdjgkvh  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(322)

本文是针对mongodbjava驱动程序版本编写的 4.2.0-beta .
假设我有一个mongo数据库,设置如下:

private val codecRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry,
fromProviders(
  PojoCodecProvider.builder()
    .automatic(true)
    .build()
));
private val client = MongoClients.create(Server.Config.mongoDbConnectionString)
private val database = client.getDatabase("myDatabase").withCodecRegistry(codecRegistry)

到目前为止相当直接。
现在想象一下我 User.scala 看起来是这样的:

case class User(val email: String)

现在,假设我有一个db操作,从如下函数执行:

def CreateUser(document: User): InsertOneResult = {
  val collection = database.getCollection("User", classOf[User])
  collection.insertOne(document)
}

一切都很好,对吧?嗯,事实上,不。。。这给了我们一个: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class models.User. 原来 POJOPojoCodecProvider 是相当字面的。。。
如果我替换 User.scala 用一个 User.java 看起来像这样。。。

public class User {
    public String email;
    public String password;
}

别再抱怨了!
我知道斯卡拉 class / case class 不是pojo。我的问题是,我该如何绕过这个限制?更复杂的是,如果我想做一个通用版本的 Create 上述方法如下:

def Create[T](document: T)(implicit ctag: ClassTag[T]): InsertOneResult = {
  val collection = getCollection[T]()
  collection.insertOne(document)
}

除非我所有的数据库存储类都是java类,否则我只是s.o.l吗?

3npbholx

3npbholx1#

好吧,既然我现在找不到更好的工作,我就贴一个好的。
正如@luismiguelmejiasuarez在他的评论中所说的,医生们说要登记每个人 class 你需要一个编解码器:

val codecRegistry = fromRegistries(
    fromProviders(
        classOf[User],
        classOf[MyOtherClass]
    ), 
DEFAULT_CODEC_REGISTRY)

虽然这使我创建泛型crud方法的希望变得复杂,但它仍然比为我希望存储在db中的每个类编写自定义编解码器要少。使用泛型crud函数仍然可以与此方法一起使用,假设您已将该类注册为编解码器提供程序。

相关问题