使用ReactiveMongo读取/写入无值为null

时间:2016-03-31 17:49:09

标签: scala reactivemongo spray-json

我们正在使用ReactiveMongo将现有REST服务从Spring / Java迁移到Spray。迁移的要求之一(无论如何它的第一阶段)是所有输入和输出必须与当前系统匹配。这个问题是业务对象允许null值 - 在数据存储区中处于静止状态,以及在服务上的GET方法中返回时。字段可能会作为PUT / POST服务的输入而丢失,但相应的值仍必须写为null到数据存储区并返回相同的值。

通常使用Option对于Scala / Spray来说,“不需要”字段不是问题,但我遇到的问题实际上是编写 {的值保持时{1}}字段为Option,当从Mongo读取 null时,将字段设置为None

在我一直在做的研究中,我找不到办法做到这一点。

以下是我的代码片段:

UserPersistent

null

PersistentUser

case class UserPersistent(id: Option[String], name: Option[String])

我在object PersistentUser { implicit object PersistentUserReader extends BSONDocumentReader[UserPersistent] { def read(doc: BSONDocument): UserPersistent = UserPersistent( id = doc.getAs[String]("_id"), name = doc.getAs[String]("name") ) } implicit object PersistentUserWriter extends BSONDocumentWriter[UserPersistent] { override def write(persisted: UserPersistent): BSONDocument = { BSONDocument( "_id" -> persisted.id, "name" -> persisted.name ) } } } 方尝试了以下内容,虽然代码编译并运行,但在执行时会抛出write()

NullPointerException

我已经使用"name" -> { val nnn = persisted.name match { case Some(n) => n case _ => null } nnn } 作为数据的“表示”,它返回OptionFormat s(但是对于所有内容),但我需要处理Mongo方面的问题。

当然有办法做到这一点 - 我错过了什么?

1 个答案:

答案 0 :(得分:0)

试试这个:

object PersistentUser {
    implicit val reader: BSONDocumentReader[UserPersistent] = Macros.reader[UserPersistent]
    implicit val writer: BSONDocumentWriter[UserPersistent] = Macros.writer[UserPersistent]
    }