не удалось найти неявный: akka.http.server.RoutingSetup

Играя с экспериментальной версией akka-http 1.0-M2, я пытаюсь создать простой пример Hello world.

import akka.actor.ActorSystem
import akka.http.Http
import akka.http.model.HttpResponse
import akka.http.server.Route
import akka.stream.FlowMaterializer
import akka.http.server.Directives._

object Server extends App {

  val host = "127.0.0.1"
  val port = "8080"

  implicit val system = ActorSystem("my-testing-system")
  implicit val fm = FlowMaterializer()

  val serverBinding = Http(system).bind(interface = host, port = port)
  serverBinding.connections.foreach { connection ⇒
    println("Accepted new connection from: " + connection.remoteAddress)
    connection handleWith Route.handlerFlow {
      path("") {
        get {
          complete(HttpResponse(entity = "Hello world?"))
        }
      }
    }
  }
}

Сбой компиляции с could not find implicit value for parameter setup: akka.http.server.RoutingSetup

Кроме того, если я изменю

complete(HttpResponse(entity = "Hello world?"))

с участием

complete("Hello world?")

Я получаю другую ошибку: type mismatch; found : String("Hello world?") required: akka.http.marshalling.ToResponseMarshallable


person Nitin...    schedule 14.01.2015    source источник


Ответы (2)


Благодаря исследованиям я смог понять, что проблема в недостатке Execution Context. Чтобы решить обе проблемы, мне нужно было включить это:

implicit val executionContext = system.dispatcher

Глядя на akka/http/marshalling/ToResponseMarshallable.scala, я вижу, что ToResponseMarshallable.apply требует этого, что возвращает Future[HttpResponse].

Кроме того, в akka/http/server/RoutingSetup.scala он нужен RoutingSetup.apply.

Может быть, команде akka просто нужно добавить еще несколько @implicitNotFound. Мне удалось найти не точный, но связанный ответ по адресу: прямое использование фьючерсов в Akka и распылить Marshaller на фьючерсы, не входящие в неявную область действия, после обновления до распыления 1.2

person Nitin...    schedule 14.01.2015

Хорошо найдено - эта проблема все еще существует с Akka HTTP 1.0-RC2, поэтому код для этого теперь должен выглядеть так (учитывая изменения их API):

import akka.actor.ActorSystem
import akka.http.scaladsl.server._
import akka.http.scaladsl._
import akka.stream.ActorFlowMaterializer
import akka.stream.scaladsl.{Sink, Source}
import akka.http.scaladsl.model.HttpResponse
import Directives._
import scala.concurrent.Future

object BootWithRouting extends App {

  val host = "127.0.0.1"
  val port = 8080

  implicit val system = ActorSystem("my-testing-system")
  implicit val fm = ActorFlowMaterializer()
  implicit val executionContext = system.dispatcher

  val serverSource: Source[Http.IncomingConnection, Future[Http.ServerBinding]] =
    Http(system).bind(interface = host, port = port)

  serverSource.to(Sink.foreach {
    connection =>
      println("Accepted new connection from: " + connection.remoteAddress)
      connection handleWith Route.handlerFlow {
        path("") {
          get {
            complete(HttpResponse(entity = "Hello world?"))
          }
        }
      }
  }).run()
}
person MrProper    schedule 07.05.2015