【问题标题】:Scala - How to send a failing response in case of an exception using FuturesScala - 如何使用 Futures 在发生异常时发送失败响应
【发布时间】:2017-07-11 14:04:30
【问题描述】:

我正在处理一个我想要非阻塞的端点。这个端点的目的非常简单,即将文档写入 Mongo 存储。我在 Play 2.5.x 应用程序中使用官方 MongoDB Scala Driver

我的理解是 MongoDB 使用 toFuture() 方法支持 Futures。 Source

问题是我的控制器中的处理方法期望解析为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)
      }
    }
  }

【问题讨论】:

    标签: java mongodb scala concurrency future


    【解决方案1】:

    用这个代替onCompleteonComplete 用于执行任何副作用操作。

    insertFuture
       .map(_ => Ok("Inserted"))
       .recover({case _ => InternalServerError})
    

    【讨论】:

      【解决方案2】:

      根据您正在尝试做的事情,您可能正在寻找transform 方法:

      val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError)
      

      【讨论】:

      • 导致两个错误。首先 - InternalServerError 上的类型不匹配,表示需要 Throwable 类型。此外,整个函数应该返回类型 FutureResult] 而不是 Unit
      猜你喜欢
      • 2017-01-23
      • 2017-02-02
      • 2015-11-20
      • 2023-03-10
      • 2012-11-10
      • 2014-08-28
      • 2021-04-12
      • 2022-11-01
      • 2023-03-07
      相关资源
      最近更新 更多