Scala Play Framework 2.3在控制器中处理未来
我有一个将方法公开为路由的控制器。在这个方法中,我调用一个长时间运行的计算,它返回一个Future[SomeType] 我现在有以下资料:Scala Play Framework 2.3在控制器中处理未来,scala,playframework,Scala,Playframework,我有一个将方法公开为路由的控制器。在这个方法中,我调用一个长时间运行的计算,它返回一个Future[SomeType] 我现在有以下资料: def compute(id: String) = Action.async { request => val result: Future[SomeType] = compute(id) result.map(value => Ok(transform(value, id))) } 到目前为止,这只是一条快乐的道路。如
def compute(id: String) = Action.async { request =>
val result: Future[SomeType] = compute(id)
result.map(value => Ok(transform(value, id)))
}
到目前为止,这只是一条快乐的道路。如果计算(id)导致失败怎么办?怎么处理?我可以用Try block来概括整个过程,但是有更好的替代方案吗?有什么建议吗?我们通常使用以下模式:
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错误请求
等。默认情况下,失败的未来将导致服务器错误响应。您可以.recover
或.recoverWith
从此类故障中回退到自定义响应。恢复块需要部分功能。因此,请您将其更改为case ex=>