2016-04-17 6 views
1

Ich weiß, dass diese Frage schon oft gestellt wurde, aber alle benutzen spray-json. Ich wollte play-json verwenden. Dies könnte der Grund sein, warum die vorgeschlagenen Lösungen das Problem nicht lösen. Das Merkmal mit der route ist in einer separaten Datei mit dem Namen RestApi.scala. Die Http.bindAndHandle, die davon Gebrauch macht, befindet sich in der Datei Main.scala. Beide Dateien ohne irrelevantes Element wurden im Folgenden vorgestellt. Wenn Sie die gesamte Datei sehen möchten, klicken Sie bitte auf die obigen Links.play-json - Konnte den impliziten Wert für den Parameter nicht finden um

RestApi.scala

package restApi 

import akka.actor.{ActorSystem, Props} 
import akka.http.scaladsl.model.StatusCodes 
import akka.http.scaladsl.server.Directives._ 
import akka.pattern.ask 
import akka.stream.ActorMaterializer 
import akka.util.Timeout 

import scala.concurrent.ExecutionContext 
import scala.concurrent.duration._ 

trait RestApi { 
    import models._ 
    import cassandraDB.{WriterActor, ReaderActor} 
    implicit val system: ActorSystem 
    implicit val materializer: ActorMaterializer 
    implicit val ec: ExecutionContext 

    implicit val timeout = Timeout(20 seconds) 

    val cassandraWriterWorker = system.actorOf(Props[WriterActor], "cassandra-writer-actor") 
    val cassandraReaderWorker = system.actorOf(Props[ReaderActor], "cassandra-reader-actor") 

    val route = 
    pathPrefix("api") { 
     pathSuffix("contact") { 
     // the line below has the error 
     (post & entity(as[Contact])) { contact => 
      complete { 
      cassandraWriterWorker ! contact 
      StatusCodes.OK 
      } 
     } 
     } ~ 
     pathSuffix("gps"/ "log") { 
     // an analogous error message is shown in the line below 
     (post & entity(as[GpsLog])) { gpsLog => 
      complete { 
      cassandraWriterWorker ! gpsLog 
      StatusCodes.OK 
      } 
     } 
     } 
    } 
} 

Main.scala

package initialization 

import akka.actor.{ActorSystem, Props} 
import akka.http.scaladsl.Http 
import akka.stream.ActorMaterializer 
import cassandraDB.{ConfigCassandraCluster, ReaderActor, WriterActor} 
import gcm.GcmServer 
import restApi.RestApi 

object Main extends App with ConfigCassandraCluster with RestApi { 

    override implicit val system = ActorSystem() 
    override implicit val materializer = ActorMaterializer() 
    override implicit val ec = system.dispatcher 

    val write = system.actorOf(Props(new WriterActor(cluster))) 
    val read = system.actorOf(Props(new ReaderActor(cluster))) 
    val gcmServer = system.actorOf(Props(new GcmServer(11054...,"AIzaSyCOnVK...")), "gcm-server") 
    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080) 


} 

ich die Linie zeigen, wo der Fehler in RestApi.scala tritt Fehlermeldung:

Error:(31, 26) could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[models.Contact] 
     (post & entity(as[Contact])) { contact => 
         ^

Die Contact ist ein Datenmodell definiert in Contact.scala.

Ich hoffe, das ist kein Duplikat, aber ich glaube wirklich nicht. Jede Hilfe wird sehr geschätzt.

Antwort

1

Es stellt sich heraus, dass es eine einfache Lösung gibt. Fügen Sie einfach resolvers += Resolver.bintrayRepo("hseeberger", "maven") zu Ihrer Build-Datei und dann "de.heikoseeberger" %% "akka-http-play-json" % "1.5.3" zu Ihren libraryDependencies hinzu und importieren Sie import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ in Ihren Code. Sie können jetzt play-json verwenden, als würden Sie spray-json verwenden.

Verwandte Themen