Play Framework 2.3处理控制器中的未来

时间:2015-09-01 11:21:45

标签: scala playframework

我有一个控制器,它将方法公开为路径。在这个方法中,我调用一个长时间运行的计算,返回Future [SomeType]。

我现在有以下内容:

  def compute(id: String) = Action.async { request =>
    val result: Future[SomeType] = compute(id)
    result.map(value => Ok(transform(value, id)))
  }

到目前为止,这只是一条快乐的道路。如果compute(id)导致失败怎么办?怎么处理?我可以用Try块包装整个东西,但有更好的选择吗?有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我们通常使用以下模式:

def compute(id: String) = Action.async { request =>
  val result: Future[SomeType] = compute(id)
  result.map(value => Ok(transform(value, id)))
    .recover { case ex =>
      Logger.error("Something went wrong", ex)
      InternalServerError
    }
}

这样,HTTP响应代码将为500 INTERNAL SERVER ERROR,因此将通知呼叫者。您可能还想在请求的参数上添加验证并返回400 BAD REQUEST等。