2016-05-24 4 views
0

Я использую Play 2.5 и Scala 2.11. Я пытаюсь использовать async Action with Future для возврата строки json, но не могу заставить ее работать. Вот мои действия:Async Action and Future

def getData = Action.async { implicit request => 
    val futureData = Future { daoObj.fetchData } 
    futureData onComplete { 
     case Success(data) => 
      Ok(Json.prettyPrint(Json.obj("data" -> data.groupBy(_.name)))) 
     case Failure(t) => 
      BadRequest(Json.prettyPrint(Json.obj(
       "status" -> "400", 
       "message" -> s"$t" 
      ))) 
    } 
} 

daoObj.fetchData возвращает scala.concurrent.Future [Список [models.Data]]

Вот models.Data:

case class Data(name: String, details: String) 

I может иметь такие данные

Data (name = "data1", details = "details1") 
Data (name = "data1", details = "details1a") 
Data (name = "data2", details = "details2") 

, что я могу присоединиться к имени, чтобы вернуть структуру формы

Map(data1 -> List("details1", "details11"), 
    data2 -> List("details2")) 

У меня есть ошибки компиляции на GroupBy:

value groupBy is not a member of scala.concurrent.Future[List[models.Data]] 

1) Как получить значение (List [models.Data]) из будущего в своем действии?

2) Это мое первое приложение Play Scala, поэтому, если у вас есть какие-либо комментарии для улучшения моего кода, это приветствуется.

+0

Похоже, у вас есть дополнительная 'Future {}' around 'daoObj.fetchData'. Убери это. – Dima

ответ

0

Вы не должны использовать Future.onComplete, который является обратным вызовом (с побочным эффектом), но .map и .recover, чтобы превратить ваш Future[T] в Future[Result], которая является то, что ожидается от Action.async.

def getData = Action.async { implicit request => 
    Future { daoObj.fetchData }.map { data => 
    Json.obj("data" -> data.groupBy(_.name)) 
    }.recover { 
    case error => BadRequest(Json.obj(
     "status" -> "400", 
     "message" -> error.getMessage 
    )) 
    } 
} 

Там нет необходимости довольно-печать на JsObject, который может быть непосредственно записан как результат (для отладки, может быть, за исключением).