Scala中如何封装Play的Status?

How to encapsulate Play's Status in Scala?

在我的代码中多次使用以下模式来恢复失败的未来:

myFuture.recover {
        case t =>
          Logger.error(s"foo bar foo, exception: ${t.getMessage}.")
       InternalServerError(views.html.error(request, Messages("error.foo")))
      }

我现在正在寻找一种封装此行为的方法,以消除代码重复。我试图将它包装在 class 中,但奇怪的是,我无法在 apply 方法中解析 InternalServerError

class MyError(t: Throwable, logMsg: String, message: String) {
  def apply(t: Throwable, logMsg: String, message: String) = {
    Logger.error(logMsg)
  InternalServerError(views.html.error(request, message))
  }
}

知道如何解决这个问题吗?另外,我该如何处理 request 参数?

我很确定您的意思是 apply 方法是伴随对象的一部分,而不是 class 本身。

至于分辨率问题,你得这样导入:

object MyError {
  def apply(t: Throwable, logMsg: String, message: String, request: Request): Result = {
    import play.api.mvc.Results._
    Logger.error(logMsg)
    InternalServerError(views.html.error(request, message))
  }
}

那你可以

MyError(t, "log something", "message", request)

作为控制器中的最后一行 Action

代码重用

使用implicit class 扩展Future 的功能并将implicit class 放入package object 或对象中。导入包 object/object 并在需要时使用代码。

object common {
 implicit class FutureUtils(future: Future[Result]) {
  def graceful(implicit req: Request, msg: String): Future[Result] = {
    future.recover { case th =>
      import play.api.mvc.Results._
      Logger.error(logMsg)
      InternalServerError(views.html.error(request, message))
    }
  }
 }
}


import common._

class Foo extends Controller {
  def bar = Action { implicit req => 
    myFuture.graceful(Messages("foo.bar"))
  }
}