我们正在使用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方面的问题。
当然有办法做到这一点 - 我错过了什么?
答案 0 :(得分:0)
试试这个:
object PersistentUser {
implicit val reader: BSONDocumentReader[UserPersistent] = Macros.reader[UserPersistent]
implicit val writer: BSONDocumentWriter[UserPersistent] = Macros.writer[UserPersistent]
}