Как восстановить ошибку из Future в EssentialAction

Начиная с примера из этого поста, мне интересно, как справиться с recover:

def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
  val maybeToken = requestHeader.headers.get("session")

  val futureIteratee: Future[Iteratee[Array[Byte], SimpleResult]] = maybeToken map { token =>
    //This returns a future...
    Session.find(token).map {
      case Some(session) => action(session)(requestHeader)
      case None => Done[Array[Byte], Result](Unauthorized("Invalid token"))
    }.recover {
      Done[Array[Byte], Result](Unauthorized("400 Error finding Security Token\n"))
    }
  } getOrElse {
    Future.successful(Done[Array[Byte], Result](Unauthorized("401 No Security Token\n")))
  }

  Iteratee.flatten(futureIteratee)
}

Приведенный выше код не компилируется, и я всегда получаю следующее сообщение об ошибке:

[error] /home/j3d/projects/test/app/Security.scala:80: type mismatch;
[error]  found   : scala.concurrent.Future[play.api.libs.iteratee.Iteratee[_4,play.api.mvc.Result] forSome { type _4 >: _3 <: Array[Byte]; type _3 <: Array[Byte] }]
[error]  required: scala.concurrent.Future[play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]]
[error]         } recover {
[error]           ^
[error] one error found
[error] (compile:compile) Compilation failed

Я что-то упускаю?


person j3d    schedule 03.06.2015    source источник


Ответы (1)


Как ни странно, я подумал, что проблема могла заключаться в том, что функция не выводит правильный тип, который вам нужен. Это случалось со мной в прошлом, когда тип результата зависел от существующего универсального типа, например. U >: T.

Однако, попробовав ваш фрагмент кода, я заметил, что вы не использовали частичную функцию для вызова recover, и после того, как я исправил, она скомпилировалась без проблем.

Session.find(token).map {
    case Some(session) => action(session)(requestHeader)
    case None => Done[Array[Byte], Result](Unauthorized("Invalid token"))
}.recover {
    case _ =>
        Done[Array[Byte], Result](Unauthorized("400 Error finding Security Token\n"))
}
person Jonathan Boudreau    schedule 03.06.2015