В моем приложении Play 2.6 у меня есть собственный класс действий, который выполняет некоторые общие действия, применимые ко всем моим действиям.Опуская несвязанные детали, код выглядит следующим образом:
class VariantAction @Inject()
(parser: BodyParsers.Default)
(implicit ec: ExecutionContext)
extends ActionBuilderImpl(parser) with Results {
///
override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
if (aok) {
block(request).andThen {
case Success(result) =>
result.withHeaders("foo" -> "bar") // THIS DOES NOT WORK
case Failure(t) =>
}
}
catch {
/// Some exception handling
}
}
else {
Future.successful(ServiceUnavailable)
}
}
}
Все работает, как и ожидалось: обратный вызов в andThen () выполняется, но заголовок, который он пытается добавить в ответ, не добавляется.Я предполагаю, что есть условие гонки, и к тому времени, когда обратный вызов вызван, ответ уже передан.Конечно, я могу добавить эту логику ко всем конкретным действиям, но это, кажется, не поддается разуму.