2017-03-10 5 views
0

Je veux utiliser akka-http et le nouveau mongo-scala-driver pour mon service de repos.Travailler avec akka-http et mongo-scala-driver

Ce code fonctionne

val routes = { 
    pathPrefix("info") { 
    pathEndOrSingleSlash { 
     get { 
     val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0") 
     val database: MongoDatabase = mongoClient.getDatabase("test") 
     val collection: MongoCollection[Document] = database.getCollection("test") 
     val future = collection.find().limit(10).toFuture() 
     val list = Await.result(future, Duration(10, TimeUnit.SECONDS)) 
     complete(list.map(_.toJson())) 
     } 
    } 
    } 
} 

Mais je veux supprimer le code de blocage Await.result et écriture asynchrone.

Comment puis-je le faire? Merci

build.sbt:

scalaVersion := "2.12.1" 

"org.mongodb.scala" %% "mongo-scala-driver" % "1.2.1" 
"com.typesafe.akka" %% "akka-http-core" % "10.0.4" 
"com.typesafe.akka" %% "akka-http" % "10.0.4" 

MISE À JOUR

Si je change mon code:

complete(future.map(_.toJson())) 

Je reçois une erreur:

Error:(160, 36) value toJson is not a member of Seq[org.mongodb.scala.Document] 
     complete(future.map(_.toJson())) 

MISE À JOUR

Si je change mon code:

 onComplete(future) { 
      case Success(value) => complete(value) 
      case Failure(ex) => complete((InternalServerError, s"An error occurred: ${ex.getMessage}")) 
     } 

Je reçois en erreur:

Error:(166, 47) type mismatch; 
found : Seq[org.mongodb.scala.bson.collection.immutable.Document] 
required: akka.http.scaladsl.marshalling.ToResponseMarshallable 
      case Success(value) => complete(value) 
+0

Quelque chose comme feature.onComplete? http://doc.akka.io/docs/akka/2.4.4/scala/http/routing-dsl/directives/future-directives/onComplete.html – Ashalynd

+0

Si je change mon code, j'obtiens une erreur: Erreur :(166, 47) incompatibilité de type; trouvé: Seq [org.mongodb.scala.bson.collection.immutable.Document] requis: akka.http.scaladsl.marshalling.ToResponseMarshallable case Succès (valeur) => complet (valeur) – bobinshtein

+0

Ou vous pouvez utiliser http: //reactivemongo.org/releases/0.12/documentation/ – cchantep

Répondre

1

caractéristique supposant un avenir, il suffit de retirer la glisse vous attendent et à faire:

complete(feature.map(_.toJson)) 
+0

Si je change mon code, j'obtiens une erreur: Erreur: (160, 36) value toJson est pas un membre de Seq [org.mongodb.scala.Document] complete (future.map (_. toJson())) – bobinshtein

+0

@bobinshtein vous n'avez pas ajouté unmarshaller. Voir: http://doc.akka.io/docs/akka-http/current/scala/http/common/marshalling.html http://doc.akka.io/docs/akka-http/current/ scala/http/common/json-support.html – jmc

+0

@bobinshtein votre problème principal est que vous n'avez pas fourni de marshaller. Il est nécessaire de convertir un type de données en un "format de fil", c'est-à-dire quelque chose que vous pouvez mettre dans une requête. – jmc