2016-04-15 6 views
0

Gibt es eine Möglichkeit, javadsl Route in Flow zu konvertieren? In Scala haben wir implizit HandlerFlow verfügbar, aber in Java haben wir keine Analoga.Route in Fluss umwandeln in Akka-Http für Java

Versucht, handlerFlow aufzurufen, verwendet jedoch scaladsl-Typen und ist mit der javadsl-Version von Route nicht kompatibel.

Ich möchte Low-Level-Version der API für die Fähigkeit, an HTTP und HTTPS zu binden, und auf Verbindungen zugreifen können.

==========================
Update: benutzte ich Idee von Antwort des svezfaz und jetzt bekomme ich Code:

Flow<HttpRequest, HttpResponse, NotUsed> createFlow(ActorSystem system, Materializer mat) { 
    scala.Function1<akka.http.scaladsl.server.RequestContext, scala.concurrent.Future<akka.http.scaladsl.server.RouteResult>> r = RouteImplementation.apply(createRoute()); 
    Flow f = RouteResult$.MODULE$.route2HandlerFlow(
     r, 
     RoutingSettings$.MODULE$.apply(system), 
     ParserSettings$.MODULE$.apply(system), 
     mat, 
     RoutingLog$.MODULE$.fromActorSystem(system), 
     null, 
     RejectionHandler$.MODULE$._mthdefault(), 
     null 
    ).asJava(); 
    return f; 
} 

Es sieht korrekt aus, aber es kompiliert nicht. Wahrscheinlich muss ich Scala Library in den Klassenpfad aufnehmen. Und dann arbeite ein wenig mit anderen Scala-zu-Java-Typ-Konvertierungen.

Ich denke, es ist einfach einfacher, es ohne Routes in Java neu zu schreiben.

Antwort

0

In Akka-http 10.0.6 können Sie

akka.http.scaladsl.server.Route.handlerFlow(route: Route): Flow[HttpRequest, HttpResponse, NotUsed] 

Es gibt einige implicits benötigt verwenden, aber sie sind einfach in Umfang zu erhalten.

1

Sie können sich inspirieren von akka.http.javadsl.server.HttpServiceBase (siehe unten). Verwenden Sie RouteImplementation, um javadsl in scaladsl zu konvertieren, und rufen Sie dann route2HandlerFlow auf, um in den Fluss zu konvertieren.

/** 
    * Uses the route to handle incoming connections and requests for the ServerBinding. 
    */ 
    def handleConnectionsWithRoute(interface: String, port: Int, route: Route, system: ActorSystem, materializer: Materializer): CompletionStage[ServerBinding] = { 
    implicit val s = system 
    implicit val m = materializer 

    import system.dispatcher 
    val r: server.Route = RouteImplementation(route) 
    Http(system).bind(interface, port).toMat(Sink.foreach(_.handleWith(akka.http.scaladsl.server.RouteResult.route2HandlerFlow(r))))(Keep.left).run()(materializer).toJava 
    }