2015-10-14 25 views
3

我正在使用Spray構建REST API。 我的JSON數據類型之一是遞歸的:無法找到惰性格式化的遞歸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) 
     } 
     } 
    } 
} 

的在GET工作,即使該函數返回Containers列表中的completeget中的註釋行不起作用,但它不起作用來隱式轉換Container中的post,如錯誤消息中所示。我應該怎麼做才能使容器工作隱含並仍然保持其遞歸結構?

回答

3

容器類是根級別JSON,所以你需要改變各自隱含的:浪費在我的部分

implicit val containerFormat: RootJsonFormat[Container] = rootFormat(lazyFormat(jsonFormat5(Container))) 
+0

如此簡單,卻又如此多小時,太感謝你了! – spydon

相關問題