2017-04-17 4 views
-1

ich den nächsten Code haben:Zukunft und Scala: Mismatch-Datentyp

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

Aber, ich bin die nächste Störung zu erhalten:

$ 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 

Die Anweisung Users.listAll ist eine Zukunft eine, die geben Sie mir eine Liste von Benutzerobjekten, die ich in JSon konvertieren muss. Wie ich sehe, gibt mir dieser Befehl den Datentyp scala.concurrent.Future [Seq [model.User]]. Wie kann ich tun, um die Seq [model.user] von diesem Befehl zu bekommen, damit ich es in convertUsersToJsonOrig verwenden kann? Dank

Antwort

3

Werfen Sie einen Blick hier für Futures mit Spiel Handhabung: 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 nimmt eine Request => Result. Während Action.async eine Request => Future[Result] dauert. Auf diese Weise können Sie den Inhalt einer Zukunft (mit map, flatMap und/oder einem for-environment) in eine Result transformieren und an den Rahmen übergeben.

+0

Ich musste hinzufügen: importieren play.api.libs.concurrent.Execution.Implicits.defaultContext danach alles sehr gut gearbeitet !! Vielen Dank –

Verwandte Themen