2016-03-31 15 views
0

Wir sind dabei, einen bestehenden REST-Service von Spring/Java zu Spray mit ReactiveMongo zu migrieren. Eine der Anforderungen für die Migration (ohnehin die erste Phase) besteht darin, dass alle Ein- und Ausgänge mit dem aktuellen System übereinstimmen müssen. Das Problem damit ist, dass die Geschäftsobjekte null Werte zulassen - sowohl im Ruhezustand im Datenspeicher als auch in GET-Methoden für den Dienst. Felder können als Eingabe für den Dienst für PUT/POST fehlen, aber die entsprechenden Werte müssen weiterhin als null in den Datenspeicher geschrieben und zurückgegeben werden.Lesen/Schreiben Keine Werte als Null mit ReactiveMongo

Normalerweise ‚nicht erforderlich‘ Felder sind kein Problem für Scala/Spray durch die Verwendung von Option, aber das Problem, das ich habe, ist eigentlich die Werte der Option Felder als null zu schreiben, als persistierende und Einstellung die Felder als None wenn lesen das gleiche null von Mongo.

In der Forschung, die ich gemacht habe, war ich nicht in der Lage, einen Weg zu finden, dies zu tun.

Hier sind Schnipsel meines Codes:

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 
      ) 
     } 
    } 

} 

ich folgendes auf der write() Seite versucht haben, und obwohl der Code compiliert und läuft, wirft es eine NullPointerException, wenn sie ausgeführt

"name" -> { 
    val nnn = persisted.name match { 
     case Some(n) => n 
     case _  => null 
    } 
    nnn 
} 

Ich habe OptionFormat für die ‚Darstellung‘ der Daten verwendet, die null s (aber für alles) gibt, aber ich brauche Pflege der Mongo Seite davon zu nehmen.

Sicherlich gibt es einen Weg, dies zu tun - was vermisse ich?

+0

'Option [T]' kann direkt gelesen oder geschrieben werden, solange es Leser und/oder Schreiber für 'T'. Nur "name" -> persisted.name' (siehe [doc] (http://reactivemongo.org/releases/0.11/documentation/bson/typeclasses.html)) – cchantep

+0

Mit 'reacticmongo.bson.BSONNull' anstelle von' null 'kann die NPE in Ihrem Code dort oben loswerden. Als eine allgemein langfristige Lösung, wenn die Standard-'Option [T]' Bson-Format (Writer und Reader) nicht so wie Sie wollen, können Sie vielleicht Ihre eigenen 'Option [T]' Writer definieren/reader/Format, das 'null' verwendet. – Pouria

Antwort

0

Dieses Versuchen:

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