簡體   English   中英

Scala & MongoDB:POJO 和 Scala 類

[英]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.

原來PojoCodecProviderPOJO的意思是相當的字面意思……

如果我用看起來像這樣的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM