[英]Scala & MongoDB: POJOs and Scala classes
這是針對 MongoDB Java 驅動程序,版本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)
現在,假設我有一個從 function 執行的數據庫操作,如下所示:
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.
原來PojoCodecProvider
中POJO
的意思是相當的字面意思……
如果我用看起來像這樣的User.java
替換User.scala
...
public class User {
public String email;
public String password;
}
沒有更多的抱怨!
我了解 Scala class
/ case class
不是 POJO。 我的問題是,我該如何繞過這個限制? 更復雜的是,如果我想制作上面給出的Create
方法的通用版本怎么辦,如下所示:
def Create[T](document: T)(implicit ctag: ClassTag[T]): InsertOneResult = {
val collection = getCollection[T]()
collection.insertOne(document)
}
除非我所有的數據庫存儲類都是 Java 類,否則我只是 SOL?
好吧,因為我現在找不到更好的解決方法,所以我會發布一個有效的解決方法。
正如@LuisMiguelMejiaSuarez 在他的評論中所說, 文檔說要注冊每個class
你需要這樣的編解碼器:
val codecRegistry = fromRegistries(
fromProviders(
classOf[User],
classOf[MyOtherClass]
),
DEFAULT_CODEC_REGISTRY)
雖然這使我創建通用 CRUD 方法的希望變得復雜,但它仍然比為我希望存儲在數據庫中的每個 class 編寫自定義編解碼器的工作量少。 假設您已將 class 注冊為編解碼器提供程序,則使用通用 CRUD 函數仍然可以使用此方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.