значение параметра класса case не является членом Serializable

Я пытаюсь создать валидатор для структуры 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 также идентифицирует это как проблему: «Не удается разрешить подзадачи символов».

Почему это происходит? Что так я скучаю?

Спасибо.


person Shurik Agulyansky    schedule 13.01.2016    source источник


Ответы (1)


Проблема в этой строке:

val valid = configJson.validate[MultiSelectConfig] getOrElse JsError

Тип valid выводится как Serializable, потому что это общий родительский тип MultiSelectConfig и JsError. Оба являются классами case, и классы case автоматически наследуются от `Serializable.

person Ryan    schedule 13.01.2016
comment
Спасибо за объяснение, я уже понял в какой строке проблема, просто не знал, почему это происходит. - person Shurik Agulyansky; 14.01.2016
comment
@ShurikAgulyansky Когда вы используете a getOrElse b, результирующий тип будет ближайшим родительским типом, общим для a и b. Если они одного типа, все хорошо, но в вашем случае в операторе val valid они не совпадают, поэтому тип Serializable. Экземпляры Serializable не имеют члена с именем subTasks, поэтому вы получаете сообщение об ошибке. В качестве альтернативы getOrElse, validate возвращает JsResult, который вы, возможно, можете сопоставить с образцом, как описано здесь< /а>. - person wwkudu; 14.01.2016