2016-01-13 35 views
0

我試圖建立JSON結構驗證器的一員,在這一點上我已經有了的東西如下:值不是序列化

讀取定義

case class SubTaskConfigElement(name: String) 

case class MultiSelectConfig(subTasks: Seq[SubTaskConfigElement]) 

implicit val subTaskConfigElementReads: Reads[SubTaskConfigElement] = 
    (__ \ "name").read[String](minLength[String](0)).map(SubTaskConfigElement) 

implicit val multiSelectConfigReads: Reads[MultiSelectConfig] = (
    (__ \ "subTasks").read[Seq[SubTaskConfigElement]] 
).map(MultiSelectConfig) 

而且我有一個單元測試如下:

val configJson = Json.parse(
       """ 
        |{ 
        | "subTasks": [ 
        |  { "name": "Sub Task 1" }, 
        |   { "name": "Sub Task 2" }, 
        |  { "name": "Sub Task 3" } 
        | ] 
        |} 
       """.stripMargin) 

      val valid = configJson.validate[MultiSelectConfig] getOrElse JsError 

      logger.info(valid + "") 

      valid must beAnInstanceOf[MultiSelectConfig] 
      valid.subTasks must beAnInstanceOf[List[SubTaskConfigElement]] 

在測試中,我得到一個錯誤的最後一行,當我執行測試:

[error] /app/process-street/test/validation/widget/config/FormFieldWidgetSpec.scala:29: value subTasks is not a member of Serializable 
[error]    valid.subTasks must beAnInstanceOf[Seq[SubTaskConfigElement]] 

的IntelliJ也將其識別爲一個問題:「無法解析符號子任務」

爲什麼會發生?我錯過了什麼?

謝謝。

回答

1

的問題是這一行:

val valid = configJson.validate[MultiSelectConfig] getOrElse JsError 

類型的valid被推斷爲Serializable,因爲這是的MultiSelectConfigJsError共同父類型。兩者都是案例類和案例類自動從`Serializable繼承。

+0

謝謝你的解釋,我已經明白哪一行是問題,只是不知道爲什麼會發生。 –

+0

@ShurikAgulyansky當你使用'getOrElse b'時,結果類型將是'a'和'b'共有的最近父類型。如果它們是相同的類型,那麼所有的都是好的,但在你的情況下,在'val valid'語句中,它們是不一樣的,所以類型是'Serializable'。 'Serializable'的實例沒有名爲'subTasks'的成員,這就是爲什麼你會得到這個錯誤。作爲'getOrElse'的替代方法,'validate'返回一個'JsResult',你可以按照[這裏](https://www.playframework.com/documentation/2.3.x/ScalaJson)的描述匹配模式匹配。 – wwkudu