2016-05-12 8 views
0

Die Play 2.5.x-Dokumente bieten kein Beispiel, das ich verwenden kann, um mein Problem mit der Definition eines impliziten Reads [T] für mein Modell zu sortieren.Compiler-Fehler Liest [T] für Einzelpfad

Könnte jemand bitte darauf hinweisen, was ich falsch mache?

Mein Modell:

case class Entry(id: Int, typ: String, caught: ZonedDateTime) 
case class Data(entries: Seq[Entry]) 

Die folgende Liest für den Entry-Typ ist in Ordnung.

implicit val entryReads: Reads[Entry] = (
     (__ \ "id").read[Int] and 
     (__ \ "typ").read[String] and 
     (__ \ "caught").read[ZonedDateTime] 
    )(Entry.apply _) 

Das Problem

ist mit meinem Reads[Data] unten. Der Compiler beschwert sich, dass er statt eines Eintrags eine Daten benötigt.

Gefunden: Reads[api.test.Entry] erforderlich: Reads[api.test.Data]

implicit val dataReads: Reads[Data] = (JsPath \ "entries").read[Seq[Entry]] 

Wenn ich Daten ändern, so dass es mehrere Felder.

case class Data(entries: Seq[Entry], someStr: String) 

Dann meine dataReads mit dem Kombinator kompiliert fein.

Das Problem ist meine Daten braucht nicht wirklich, dass String.

Die Play-Dokumentation enthält zahlreiche Beispiele für das Definieren von impliziten Lese-/Schreibvorgängen für Fallklassen mit mehr als einem Feld, aber keinem mit einem einzelnen Feld.

Antwort

0

Wenn Sie mehrfach Felder verwenden möchten, verwenden Sie Funktions Syntax und FunctionalBuilder.apply Funktion, die Data.apply Parameter füllt:

implicit val dataReads: Reads[Data] = (... and ...)(Data.apply _) 

ist die gleiche

val dataBuilder: FunctionalBuilder[Reads]#CanBuild2[Seq[Entry], String] = (... and ...) 

implicit val dataReads: Reads[Data] = dataBuilder(Data.apply _) 

Für ein Feld Liest funktionelle Syntax nicht verwendet wird, so dass Sie Data.apply Parameter selbst mit Mapping (__ \ "entries") zu Data.entries

implicit val dataReads: Reads[Data] = (
    (__ \ "entries").read[Seq[Entry]].map(Data) 
) 
+0

danke für info. –