logger.error("string",e) 使用 future 和 async 时无法在 scala-play 中工作

logger.error("string",e) Not working in scala-play while using future and async

我遇到了错误 对于 logger.error ( "字符串", e )

类型单元的表达式不符合预期类型 _U

代码如下

object DataFormatController extends Controller {

  val logger: Logger = Logger("Data Format Controller")
  val dataFormatDao = new DataFormatDao(Global.cassandraSession, Global.getKeyspace)

  def listFormats(companyId: Option[String], userId: Option[String]) = Action.async(parse.anyContent){
    import play.api.libs.concurrent.Execution.Implicits.defaultContext
     implicit request =>
       val json = Json.obj("company_id" -> companyId, "user_id" -> userId)
       val reqResult = json.validate[ListDataFormatRequest](listFormatReads)


  reqResult match {
    case s: JsSuccess[ListDataFormatRequest] =>
      val formatsFuture = dataFormatDao.findAllAsync(s.get.companyId).map(f => {
          val res = f.map(x => {
            new ListDataFormat(x.format, x.id)
          })
        Ok(Json.obj("status" -> 1, "data" -> Json.toJson(res)))
      })

      formatsFuture.recover {
        case e: Throwable => {
          BadRequest(Json.toJson(Response(0, errorMessage = Some(e.getMessage))))
          logger.error("asd",e)
        }
      }
    case e: JsError => Future(BadRequest(Json.toJson(
      Response(0, errorMessage = Some(Utils.convertToReadableMessage(e))))))
  }
}
}

我想记录这个错误!

当您在未来使用 recover 时,您需要 return 一个与原始未来相同(大概)类型的值。

  formatsFuture.recover {
    case e: Throwable => {
      BadRequest(Json.toJson(Response(0, errorMessage = Some(e.getMessage))))
      logger.error("asd",e)
    }
  }

块中的最后一个值是 return 值。由于这是对 logger.error 的调用,编译器认为您正在 returning 值 Unit,这不满足 recover.

的要求

应调换顺序,使 BadRequest 为 returned:

  formatsFuture.recover {
    case e: Throwable => {
      logger.error("asd",e)
      BadRequest(Json.toJson(Response(0, errorMessage = Some(e.getMessage))))          
    }
  }