首页 > 解决方案 > 无法在 ActionBuilderImpl.invokeBlock() 中附加响应标头

问题描述

在我的 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() 中的回调被执行,但它试图添加到响应中的标头没有被添加。我想有一个竞争条件,当回调被调用时,响应已经提交。当然,我可以将这个逻辑添加到所有具体行动中,但这似乎有悖于理性。

标签: scalaplayframeworkplayframework-2.6

解决方案


构造block(request).andThen ...返回只是一个result它不返回带有标题的结果"foo"。也就是它返回 的结果block(request),而不是 的结果.andThen。中的回调.andThen最终会起作用,以为不会返回结果。

尝试更改andThenmap. andThen用于“副作用”,“地图”用于“转换”结果。

这里的区别:

在此处输入图像描述

您还需要确保稍后在操作中不覆盖“foo”标头。


推荐阅读