2016-05-12 65 views
0

Play 2.5.x文檔沒有提供一個示例,我可以用它來爲我的模型定義一個隱式Reads [T],嘗試排序我的問題。編譯器錯誤爲單一路徑讀取[T]

有人能指出我做錯了嗎?

我的模型:

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

下讀取的條目類型是罰款。

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

問題

是我下面的Reads[Data]。編譯器抱怨它需要一個數據而不是一個Entry。

發現:Reads[api.test.Entry]要求:Reads[api.test.Data]

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

如果我修改數據,以便它有多個領域。

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

然後我的dataReads使用combinator編譯好。

implicit val dataReads: Reads[Data] = (
     (__ \ "entries").read[Seq[Entry]] and 
     (__ \ "someStr").read[String] 
    )(Data.apply _) 

問題是我的數據並不真的需要該字符串。

Play文檔包含大量的示例,它們爲多個單個字段但沒有單個字段的Case類定義隱式Reads/Writes。

回答

0

如果你用乘法領域,您使用的功能語法和FunctionalBuilder.apply功能,填補Data.apply參數:

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

是相同

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

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

對於一個字段讀不使用功能語法,所以你必須通過自己與測繪(__ \ "entries")填寫Data.apply參數Data.entries

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

感謝您的信息。 –