Scala - 如何在使用 Futures 发生异常时发送失败响应
Scala - How to send a failing response in case of an exception using Futures
我正在开发一个我希望成为非阻塞的端点。这个端点的目的非常简单,即将文档写入 Mongo 存储。我在 Play 2.5.x 应用程序中使用官方 MongoDB Scala Driver。
我的理解是MongoDB支持使用toFuture()
方法的Futures。 Source
问题是我的控制器中的处理方法需要解析为 Future[Result]
类型。但是,onComplete
回调(或其他回调函数)只return类型Unit
,导致编译错误。是否有任何替代模式用于这些情况?我有哪些选择?
注意 - 我知道 Play 会在写入失败的情况下捕获异常并自动抛出 500。但在这种情况下,我想手动处理它
class WriteController extends Controller {
def writeSingleEvent = Action.async { implicit request =>
val mongo = mongoService.getMongoClient() // my mongoservice
val database_name: String = request.getQueryString("database").getOrElse("")
val collection_name: String = request.getQueryString("collection").getOrElse("")
if (database_name == "" || collection_name == "") {
Future(BadRequest("Must specify database and collection names"))
} else {
val database = mongo.getDatabase(database_name)
val collection = database.getCollection(collection_name)
val body = request.body.asJson.get.toString
val bsondocument = BsonDocument.apply(body)
val document = Document(bsondocument)
val insertFuture = collection.insertOne(document).toFuture()
insertFuture.onComplete {
case Success(_) => Future(Ok("Inserted"))
case Failure(_) => Future(InternalServerError)
}
}
}
根据您的尝试,您可能正在寻找 transform
方法:
val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError)
用这个代替 onComplete
。 onComplete
用于执行任何副作用操作。
insertFuture
.map(_ => Ok("Inserted"))
.recover({case _ => InternalServerError})
我正在开发一个我希望成为非阻塞的端点。这个端点的目的非常简单,即将文档写入 Mongo 存储。我在 Play 2.5.x 应用程序中使用官方 MongoDB Scala Driver。
我的理解是MongoDB支持使用toFuture()
方法的Futures。 Source
问题是我的控制器中的处理方法需要解析为 Future[Result]
类型。但是,onComplete
回调(或其他回调函数)只return类型Unit
,导致编译错误。是否有任何替代模式用于这些情况?我有哪些选择?
注意 - 我知道 Play 会在写入失败的情况下捕获异常并自动抛出 500。但在这种情况下,我想手动处理它
class WriteController extends Controller {
def writeSingleEvent = Action.async { implicit request =>
val mongo = mongoService.getMongoClient() // my mongoservice
val database_name: String = request.getQueryString("database").getOrElse("")
val collection_name: String = request.getQueryString("collection").getOrElse("")
if (database_name == "" || collection_name == "") {
Future(BadRequest("Must specify database and collection names"))
} else {
val database = mongo.getDatabase(database_name)
val collection = database.getCollection(collection_name)
val body = request.body.asJson.get.toString
val bsondocument = BsonDocument.apply(body)
val document = Document(bsondocument)
val insertFuture = collection.insertOne(document).toFuture()
insertFuture.onComplete {
case Success(_) => Future(Ok("Inserted"))
case Failure(_) => Future(InternalServerError)
}
}
}
根据您的尝试,您可能正在寻找 transform
方法:
val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError)
用这个代替 onComplete
。 onComplete
用于执行任何副作用操作。
insertFuture
.map(_ => Ok("Inserted"))
.recover({case _ => InternalServerError})