Лениво отформатированный рекурсивный тип JSON не может быть найден как неявное значение

Я использую Spray для создания REST API. Один из моих типов данных JSON является рекурсивным:

case class Container(id: String,
                 name: String,
                 read_only: Boolean,
                 containers: List[Container],
                 content: List[Content])

object PeriusJsonProtocol extends DefaultJsonProtocol {
  implicit val contentFormat = jsonFormat8(Content)
  implicit val containerFormat: JsonFormat[Container] = lazyFormat(jsonFormat5(Container))
}

При завершении маршрута в HttpService я получаю следующую ошибку:

Error:(49, 18) could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container]
        entity(as[Container]) { container =>
                 ^

Error:(49, 18) not enough arguments for method as: (implicit um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container])spray.httpx.unmarshalling.FromRequestUnmarshaller[Container].
Unspecified value parameter um.
        entity(as[Container]) { container =>
                 ^

HttpService выглядит так:

import akka.actor.Actor
import spray.routing._
import spray.httpx.SprayJsonSupport._

import PeriusJsonProtocol._

class RestServiceActor extends Actor with RestService {
  def actorRefFactory = context
  def receive = runRoute(projectsRoute)
}

// this trait defines our service behavior independently from the service actor
trait RestService extends HttpService {
  private val PROJECTS  = "projects"

  val projectsRoute =
    path(PROJECTS) {
      get {
        complete(MongoUtil.getAll(PROJECTS, META) map ContainerMap.fromBson)
        //complete(Container("test", "name", false, List(), List()))
      } ~ post {
        entity(as[Container]) { 
          //complete(MongoUtil.insertProject(container))
          complete(container)
        }
      }
    }
}

complete в GET работает, хотя эта функция возвращает список контейнеров. Однако закомментированная строка в get не работает, и она не работает для неявного преобразования Контейнера в post, как видно из сообщений об ошибках. Что мне сделать, чтобы контейнер работал неявно и при этом сохранял свою рекурсивную структуру?


person spydon    schedule 14.10.2015    source источник


Ответы (1)


Класс Container представляет собой json корневого уровня, поэтому вам нужно изменить соответствующий неявный код на:

implicit val containerFormat: RootJsonFormat[Container] = rootFormat(lazyFormat(jsonFormat5(Container)))
person Makis Arvanitis    schedule 14.10.2015
comment
Так просто и в то же время так много часов потрачено впустую с моей стороны, большое спасибо! - person spydon; 14.10.2015