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?
'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
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