2016-03-31 6 views
0

Мы находимся в процессе переноса существующей службы 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 с (но за все), но мне нужно заботиться о стороне Монго этого.

Несомненно, есть способ сделать это - что мне не хватает?

+0

'Option [T]' может быть непосредственно для чтения или записи, до тех пор, пока существует читателя и/или автор для 'Т *. Просто «имя» -> persisted.name' (см. [Doc] (http://reactivemongo.org/releases/0.11/documentation/bson/typeclasses.html)) – cchantep

+0

Использование 'reactivemongo.bson.BSONNull' вместо' null' может избавиться от NPE в вашем коде там. Как правило, более долгосрочное решение, если стандартный формат 'Option [T]' bson (писатель и читатель) не ведет себя так, как вы хотите, возможно, вы можете определить свой собственный 'Option [T]' writer/reader/format, который использует «null». – Pouria

ответ

0

Попробуйте:

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

 Смежные вопросы

  • Нет связанных вопросов^_^