2016-01-13 2 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, потому что это общий родительский тип MultiSelectConfig и JsError. Оба класса case и классы case автоматически наследуются от `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

Смежные вопросы