2017-07-04 2 views
0

Je voulais utiliser Alpakka pour gérer le téléchargement et le téléchargement de S3 avec Akka Steams. Cependant, je suis resté coincé avec l'utilisation de Source produite par S3Client dans les routes Akka Http. Le message d'erreur que je reçois est:Achèvement de la source [ByteString, _] dans Akka-Http

[error] found : akka.stream.scaladsl.Source[akka.util.ByteString,_$1] where type _$1 
[error] required: akka.http.scaladsl.marshalling.ToResponseMarshallable 
[error]  complete(source) 

Je suppose qu'il est quelque chose trivial ennuyeux, comme manquer l'importation implicite, mais je n'a pas pu localiser avec précision ce que je suis absent.

J'ai créé quelques exemples minimum pour illustrer la question:

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.server.Directives._ 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl.Source 
import akka.util.ByteString 

import scala.concurrent.ExecutionContext 

class Test { 

    implicit val actorSystem: ActorSystem = ActorSystem() 
    implicit val materializer: ActorMaterializer = ActorMaterializer() 
    implicit val executionContext: ExecutionContext = actorSystem.dispatcher 

    val route = (path("test") & get) { 
    def source: Source[ByteString, _] = ??? // just assume that I am able to get that value 
    complete(source) // here error happens 
    } 

    Http().bindAndHandle(route, "localhost", 8000) 
} 

Avez-vous des suggestions, que puis-je essayer? J'utilise

libraryDependencies += "com.typesafe.akka"%% "akka-http" % "10.0.5" 

Répondre

4

Vous devez créer un HttpEntity de la source, et lui donner un type de contenu.

complete(HttpEntity(ContentTypes.`application/json`, source)) 
+0

Plus spécifiquement, 'HttpEntity.Default'. "Il a une longueur connue et présente ses données en tant que Source [ByteString]". –

+1

Merci! J'ai été troublé par le deuxième paragraphe de http://doc.akka.io/docs/akka-http/10.0.9/scala/http/routing-dsl/source-streaming-support.html. J'ai (mis) compris qu'il y a une conversion implicite qui me manque. –

+0

Je vois. Des implicits supplémentaires ne sont nécessaires que si vous souhaitez diffuser directement des classes personnalisées, en les convertissant en JSON sous le capot. –