【问题标题】:ObjectIds don't get retrieved from collection (Scala + MongoDB)未从集合中检索 ObjectIds (Scala + MongoDB)
【发布时间】:2019-07-11 14:47:37
【问题描述】:

我的计算机上有一个带有数据库的 MongoDB 实例。其中一个集合中有几个文档,我手动插入了它们。有一个 Scala 应用程序来操作数据库。有一个名为 Location 的案例类。

case class Location(_id: Option[ObjectId] = None, name: String) {
  var visible: Boolean = false
}

这是应用程序中的 MongoDB 配置。

private val customCodecs = fromProviders(
  classOf[Location]
)
private val javaCodecs =
    fromCodecs(new LocalDateTimeDateCodec(), new LocalDateDateCodec())

private val codecRegistry =
  fromRegistries(customCodecs, javaCodecs, 
  DEFAULT_CODEC_REGISTRY)
val dbConnection = MongoClient(dbURI)

val database: MongoDatabase = dbConnection.getDatabase(dbName).withCodecRegistry(codecRegistry)

customCodecs 中有更多的classOf 定义,只是将它们删除。 dbURI 字符串是从配置文件中检索的。 有一个控制器端点,它返回数据库中的所有位置。结果是这样的:

[{"_id":{},"name":"Hungary","visible":false},{"_id":{},"name":"Germany","visible":false},{"_id":{},"name":"France","visible":false},{"_id":{},"name":"Switzerland","visible":false},{"_id":{},"name":"Poland","visible":false}]

数据库中的文档有ObjectId,因为我是手动输入的,有些文档应该有visibility属性true。我怀疑 JSON 序列化有问题,但无法弄清楚是什么。 这是查询集合的代码。

val query = collection.find().toFuture()
Await.result(query, 10.seconds).toList

服务方法调用此代码并将结果传递给控制器​​。

import org.json4s.native.Serialization.write
val languages = enrollmentService.getAllLanguages
    logger.info("GET all languages")
    Ok(Json.parse(write[List[Language]](languages)))

我使用 json4s 进行 JSON 序列化/反序列化。

这可能是什么问题?

【问题讨论】:

    标签: json mongodb scala json4s objectid


    【解决方案1】:

    也许您需要包含 org.json4s.mongo.ObjectIdSerializer?

    【讨论】:

    • 出于某种原因,我无法解决这个问题。我找到了该序列化程序,但无法导入它。我在项目中有最新版本的json4s(3.6.4)。
    • 无论如何,我设法根据org.json4s.mongo.ObjectIdSerialize的代码实现了一个CustomSerializer
    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多