2017-04-17 2 views
-1

J'ai le code suivant:avenir et Scala: incompatibilité de type de données

package controllers.usersPage 

import play.api.mvc._ 
import play.api.libs.json._ 
import model.{User, Users, Patients, CObject} 
import scala.concurrent.Future 

import service.{UserService} 

class allUsersToJSON() extends Controller { 

def convertUsersToJsonOrig(lusers: Seq[User]): JsValue = {Json.toJson(
               lusers.map { u => Map("id" -> u.id, "firstName" -> u.firstName, "lastName" -> u.lastName, "email" -> u.email, "username" -> u.username, "password" -> u.password)}) } 


def retAllUsers = Action { request => 
    Ok(Json.stringify(convertUsersToJsonOrig(Users.listAll))) 
    } 
} 

Mais, je reçois l'erreur suivante:

$ compile 
[info] Compiling 69 Scala sources and 3 Java sources to 
H:\project\target\scala-2.11\classes... 
[error] H:\project\app\controllers\usersPage\retrieveAllUsersJSON.scala:29: type mismatch; 
[error] found : scala.concurrent.Future[Seq[model.User]] 
[error] required: Seq[model.User] 
[error]  Ok(Json.stringify(convertUsersToJsonOrig(Users.listAll))) 
[error]             ^
[warn] Class com.sun.tools.xjc.Options not found - continuing with a stub. 
[warn] one warning found 
[error] one error found 
[error] (root/compile:compileIncremental) Compilation failed 
[error] Total time: 7 s, completed Apr 17, 2017 10:51:11 AM 

Le Users.listAll d'instruction est un un avenir qui donnez-moi une liste d'objets Utilisateur que je devrai convertir en JSon. Comme je vois cette commande me donne le type de données scala.concurrent.Future [Seq [model.User]]. Comment puis-je obtenir le Seq [model.user] à partir de cette commande pour pouvoir l'utiliser dans convertUsersToJsonOrig? Merci

Répondre

3

Jetez un coup d'oeil ici pour le traitement des contrats à terme avec le jeu: https://www.playframework.com/documentation/2.5.x/ScalaAsync

def retAllUsers = Action.async { request => 
    for { 
    users <- Users.listAll 
    } yield Ok(Json.stringify(convertUsersToJsonOrig(users))) 
} 

Action prend un Request => Result. Alors que Action.async prend un Request => Future[Result]. Cela vous permet de transformer le contenu d'un futur (en utilisant map, flatmap, et/ou for-comprehension) en un Result et de le donner au framework à traiter.

+0

Je devais ajouter: importer play.api.libs.concurrent.Execution.Implicits.defaultContext après que tout a très bien fonctionné !! Merci –