Мы находимся в процессе переноса существующей службы REST с Spring/Java на Spray с использованием ReactiveMongo. Одним из требований к миграции (на первом этапе) является то, что все входы и выходы должны соответствовать текущей системе. Проблема с этим - это бизнес-объекты, которые позволяют значения null
- как в покое в хранилище данных, так и при возврате в методах GET службы. Поля могут отсутствовать в качестве входа в службу для PUT/POST, но соответствующие значения все равно должны быть записаны как null
в хранилище данных и возвращены.Чтение/запись Нет значений как null с ReactiveMongo
Обычно «не требуется» поля не является проблемой для Scala/спрей на основе использования Option
, но вопрос у меня на самом деле писать значения Option
полей, null
при сохраняющихся и настройка поля как None
, когда чтение те же null
от Mongo.
В исследовании, которое я делал, я не смог найти способ сделать это.
Вот фрагменты моего кода:
UserPersistent
case class UserPersistent(id: Option[String], name: Option[String])
PersistentUser
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
для «представления» данных, которая возвращает null
с (но за все), но мне нужно заботиться о стороне Монго этого.
Несомненно, есть способ сделать это - что мне не хватает?
'Option [T]' может быть непосредственно для чтения или записи, до тех пор, пока существует читателя и/или автор для 'Т *. Просто «имя» -> persisted.name' (см. [Doc] (http://reactivemongo.org/releases/0.11/documentation/bson/typeclasses.html)) – cchantep
Использование 'reactivemongo.bson.BSONNull' вместо' null' может избавиться от NPE в вашем коде там. Как правило, более долгосрочное решение, если стандартный формат 'Option [T]' bson (писатель и читатель) не ведет себя так, как вы хотите, возможно, вы можете определить свой собственный 'Option [T]' writer/reader/format, который использует «null». – Pouria