2014-01-05 6 views
12

Ich habe diesen Fall KlasseSpray-json Fehler: nicht impliziten Wert für den Parameter um finden konnte

case class Person(val name: String) 

object JsonImplicits extends DefaultJsonProtocol { 
    implicit val impPerson = jsonFormat1(Person) 
} 

Ich versuche, Spray-json, um Post-Anforderung zu analysieren:

post { 
    entity(as[Person]) { person => 
     complete(person) 
    } 
    } 

jedoch ich erhalte, wenn ich versuche, dies zu kompilieren:

src/main/scala/com/example/ServiceActor.scala:61: error: could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller[com.example.Person]

ich verstehe nicht, was los ist, wie kann ich dieses Problem beheben zu funktionieren?

dank

+2

Haben Sie importieren JsonImplicits._ in Ihre Routen? – vitalii

+10

und nicht vergessen Import spray.httpx.SprayJsonSupport._ –

Antwort

13

des Spray ‚Einheit [E]‘ Richtlinie verlangt für die Art in ihrem Umfang impliziten Einweiser E. JsonImplicits Objekt erstellt json Einweiser und Unmarshaller für den Typ E.

Sie müssen sicherstellen, dass implicit val impPerson im Bereich liegt, also import JsonImplicits._ oberhalb der Routendefinition steht.

+0

Ich zog meine Haare mit genau dem gleichen Problem. Obwohl ich gute [Docs] gelesen habe (http://www.artima.com/pins1ed/implicit-conversions-and-parameters.html) und sogar die gleiche Seed-Projekt-Codebase, die ich nicht über die Route realisiert habe, hatte einen anderen Umfang. _ * Bereichsregel *: Eine eingefügte implizite Konvertierung muss im Geltungsbereich als einzelne Kennung oder mit dem Quell- oder Zieltyp der Konvertierung verknüpft sein. Der Scala-Compiler berücksichtigt nur implizite Konvertierungen im Gültigkeitsbereich. Um eine implizite Konvertierung verfügbar zu machen, müssen Sie sie also irgendwie in scope_ –

-1
package abc.json 

import spray.json.DefaultJsonProtocol 


object OrderJsonProtocol extends DefaultJsonProtocol { 

    implicit val orderFormat = jsonFormat1(Order) 
} 


case class Order(orderNumber: String) 

import akka.actor.Actor 
import abc.json._ 
import spray.routing.HttpService 

class OrderRestServiceActor extends Actor with HttpService { 

    def actorRefFactory = context 

    def receive = runRoute(route) 



    val route = { 
    import OrderJsonProtocol._ 
    import spray.httpx.SprayJsonSupport.sprayJsonUnmarshaller 


    path("order") { 
     post { 
     println("inside the path") 
     entity(as[Order]) { order => 
     complete(s"OrderNumber: ${order.orderNumber}") 
     } 

     } 
    } 

    } 

} 
+0

bringen. Das obige funktioniert. Eine Menge Leute sagen, importieren Sie nur über und es hat lange gedauert, um es herauszufinden. Hier ist der Code –