2017-04-17 69 views
-1

我有下面的代碼:未來和Scala:數據類型不匹配

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

但是,我得到了一個錯誤:

$ 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 

指令Users.listAll是未來的一個將給我一個我需要轉換爲JSon的用戶對象列表。正如我看到這個命令給我scala.concurrent.Future [Seq [model.User]]數據類型。我怎麼能從這個命令獲取Seq [model.user],以便我可以在convertUsersToJsonOrig中使用它? 感謝

回答

3

看看這裏辦理期貨與玩法: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需要Request => Result。而Action.async需要Request => Future[Result]。這允許您將未來的內容(使用map,flatMap和/或for-comprehension)轉換爲Result,並將其交給框架處理。

+0

我需要補充: import play.api.libs.concurrent.Execution.Implicits.defaultContext 之後,所有的工作都很好!謝謝 –