2016-03-30 6 views
0

У меня есть одна ошибка компиляции, которую я еще не могу решить. Речь идет о действии, добавляющем нового пациента в монго, если он еще не находится в базе данных. Первая модель:Play Scala Framework: введите несоответствие scala.concurrent.Future [Object] [error] required: scala.concurrent.Future [play.api.mvc.Result]

case class PatientData(id : String) 

object PatientData { 
    implicit val PatientDataFormat = Json.format[PatientData] 
    } 

Функция поиска пациента в Монго:

def findPatientById(mode : String, id : String) : Future[Option[PatientData]] = { 
    val collection = getPatientCollection(mode) 
    collection.find(Json.obj("id" -> id)).one[PatientData] 
    } 

Действие Играть:

def create(patientId: String) = Action.async(parse.json) { request => 
    val token = "dummy" 
    isAuthorized(token) match { // always return Some(thing) 
     case None => Future.successful(Unauthorized("Invalid token " + token)) 
     case Some(_) => 
     request.body.validate[PatientData] map { 
      patientData => 
      findPatientById(mode,patientId) map { finded => 
      finded match { 
       case Some(_) => Future.successful(NotAcceptable("The patient is already exist.")) 
       case None => 
       Logger.info("Create the patient .. ") 
       Future.successful(Created) 
      } 
      } 
     } getOrElse { 
      Future.successful(BadRequest) 
     } 
    } 

Я знаю, что я могу решить эту проблему с помощью вызова Await.result в функции findPatientById, но я хочу избежать этого решения и позволить Future выполнять свою работу. Проблема в том, что я получаю ошибку компиляции:

[error] /home/afk/git/bioserenity/bioserenity-backend/app/controllers/MedataController.scala:90: type mismatch; 
[error] found : scala.concurrent.Future[Object] 
[error] required: scala.concurrent.Future[play.api.mvc.Result] 
[error]   } getOrElse { 
[error]   ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 

У кого-нибудь есть идея решить эту проблему?

ответ

2

Вы, вероятно, следует попытаться использовать

findPatientById(mode,patientId) flatMap { ... 

вместо исходной линии. Здесь вызов map заменяется на flatMap, так что экземпляр, возвращаемый этим блоком кода, равен Future[Something], а не Future[Future[Something]].

+0

Спасибо за исправление :) – alifirat

Смежные вопросы