Search code examples
scalaakka-httpplay-json

play-json - Could not find implicit value for parameter um


I know this question has been asked many times before, however all of them use spray-json. I wanted to use play-json. This might be why the proposed solutions don't solve the problem. The trait with the route is in a separate file named RestApi.scala. The Http.bindAndHandle which makes use of it is in the file named Main.scala. Both files without irrelevant element removed are presented below. If you want to see the whole file please click at the links above.

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)


}

I point out the line where the error occurs in RestApi.scala Error Message:

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

The Contact is a data model defined in Contact.scala.

I hope this isn't a duplicate, but I really don't think so. Any help is much appreciated.


Solution

  • It turns out there is an easy solution. Simply add resolvers += Resolver.bintrayRepo("hseeberger", "maven") to your build file and then "de.heikoseeberger" %% "akka-http-play-json" % "1.5.3" to your libraryDependencies and import import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ into your code. You can now use play-json like you would use spray-json.