2015-01-14 3 views
6

Giocando con, Akka-http sperimentale 1.0-M2 Sto cercando di creare un semplice Ciao esempio del mondo.non riusciva a trovare implicita ...: akka.http.server.RoutingSetup

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?")) 
     } 
     } 
    } 
    } 
} 

compilazione fallisce con could not find implicit value for parameter setup: akka.http.server.RoutingSetup

Inoltre, se cambio

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

con

complete("Hello world?") 

ottengo un altro errore: type mismatch; found : String("Hello world?") required: akka.http.marshalling.ToResponseMarshallable

risposta

7

Con la ricerca sono stato in grado di capire il problema di essere la mancanza di Execution Context. Per risolvere sia il problema che ho bisogno di includere questo:

implicit val executionContext = system.dispatcher 

Guardando in akka/http/marshalling/ToResponseMarshallable.scala vedo ToResponseMarshallable.apply richiede che restituisce un Future[HttpResponse].

Inoltre akka/http/server/RoutingSetup.scala, RoutingSetup.apply ne ha bisogno.

Può essere Akka squadra ha solo bisogno di aggiungere più @implicitNotFound s. Sono stato in grado di trovare non esatta, ma la risposta relativa a: direct use of Futures in Akka e spray Marshaller for futures not in implicit scope after upgrading to spray 1.2

2

ben trovato - questo problema esiste ancora con Akka HTTP 1.0-RC2, in modo che il codice per che ora deve assomigliare a questo (dato loro cambiamenti 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() 
}