2016-05-12 5 views
2

Ich habe folgende Klasse und möchte reactivemongo.bson.Macros.handler verwenden, um den Leser und Schreiber automatisch zu bekommen.ReactiveMongo BSONHandler für Karte

case class Data(a: String, b: Map[String, String]) 
object Data { 
    implicit val dataHandler = reactivemongo.bson.Macros.handler[Data] 
} 

Aber es scheitert, zu kompilieren, zu sagen Implicit Map[String,String] for 'value vs' not found

Wie diese Arbeit zu machen? Ich verwende reactivemongo_2.10 0.11.10

Antwort

2

Nach this gist, ich habe eine Lösung zu finden:

case class Data(date: String, base: String, vs: Map[String, String]) 

object Data { 
    implicit object BSONMapHandler extends BSONHandler[BSONDocument, Map[String, String]] { 
    override def read(bson: BSONDocument): Map[String, String] = { 
     bson.elements.map { 
     case (key, value) => key -> value.asInstanceOf[BSONString].value 
     }.toMap 
    } 

    override def write(t: Map[String, String]): BSONDocument = { 
     val stream: Stream[Try[(String, BSONString)]] = t.map { 
     case (key, value) => Try((key, BSONString(value))) 
     }.toStream 
     BSONDocument(stream) 
    } 
    } 
    implicit val dataHandler = reactivemongo.bson.Macros.handler[Data] 
} 

Sie wissen nicht, warum reactivemongo unterstützen es nicht standardmäßig aktiviert.

+0

Die Unterstützung eines Wörterbuchs, statt getippte Fall klassifiziert, scheint nicht sehr nützlich. – cchantep

+0

@cchanstep Wenn die Fallklasse ein Feld vom Typ 'Map' enthält, muss der Benutzer etwas implementieren, damit die Dinge funktionieren, es scheint nicht sehr praktisch zu sein. –

+0

@cchantep Sie sagen, nicht zu argumentieren. Bitte sagen Sie uns, warum es Ihnen nicht sehr nützlich erscheint. – fish

Verwandte Themen