[英]Scala - How to send a failing response in case of an exception using Futures
我正在开发一个我希望不受阻碍的端点。 该端点的目的非常简单,即将文档写入Mongo商店。 我在Play 2.5.x应用中使用了官方的MongoDB Scala驱动程序。
我的理解是MongoDB使用toFuture()
方法支持Futures。 资源
问题是控制器中的处理方法希望解析为Future[Result]
类型。 但是, onComplete
回调(或其他回调函数)仅返回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)
}
}
}
使用它代替onComplete
。 onComplete
用于执行任何副作用操作。
insertFuture
.map(_ => Ok("Inserted"))
.recover({case _ => InternalServerError})
根据您的尝试,您可能正在寻找transform
方法:
val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.