本文是针对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.
原来 POJO
在 PojoCodecProvider
是相当字面的。。。
如果我替换 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吗?
1条答案
按热度按时间3npbholx1#
好吧,既然我现在找不到更好的工作,我就贴一个好的。
正如@luismiguelmejiasuarez在他的评论中所说的,医生们说要登记每个人
class
你需要一个编解码器:虽然这使我创建泛型crud方法的希望变得复杂,但它仍然比为我希望存储在db中的每个类编写自定义编解码器要少。使用泛型crud函数仍然可以与此方法一起使用,假设您已将该类注册为编解码器提供程序。