繁体   English   中英

Scala-如何使用期货发送异常情况下的失败响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM