如何封装Play';s在Scala的地位?

如何封装Play';s在Scala的地位?,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,在我的代码中,我多次使用以下模式来恢复失败的未来: myFuture.recover { case t => Logger.error(s"foo bar foo, exception: ${t.getMessage}.") InternalServerError(views.html.error(request, Messages("error.foo"))) } 我现在正在寻找一种封装这种行为的方法,以消除代码重复。我试图

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

myFuture.recover {
        case t =>
          Logger.error(s"foo bar foo, exception: ${t.getMessage}.")
       InternalServerError(views.html.error(request, Messages("error.foo")))
      }
我现在正在寻找一种封装这种行为的方法,以消除代码重复。我试图将其封装在类中,但奇怪的是,我无法在
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))
  }
}

你知道我怎么解决这个问题吗?另外,我如何处理
请求
参数?

我很确定您的意思是
应用
方法是伴随对象的一部分,而不是类本身

至于解决问题,您必须按如下方式导入:

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
中的最后一行,我很确定您的意思是
apply
方法是伴随对象的一部分,而不是类本身

至于解决问题,您必须按如下方式导入:

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)

作为控制器中的最后一行
操作
代码重用

使用
隐式类
扩展
未来
的功能,并将
隐式类
放入
包对象
或对象中。导入包对象/对象,并在需要时使用代码

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"))
  }
}

代码重用

使用
隐式类
扩展
未来
的功能,并将
隐式类
放入
包对象
或对象中。导入包对象/对象,并在需要时使用代码

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"))
  }
}

非常感谢。我真的很喜欢这个解决方案。但是,该代码不会在我的机器上编译。我得到了以下错误:
应该是标识符,但找到了“implicit”。
@JohnDoe您必须创建一个
包对象
这是一个很好的解决方案,但建议您明智地使用implicit,因为它会使代码变得非常复杂。@JohnDoe。。。请现在检查谢谢!我真的很喜欢这个解决方案。但是,该代码不会在我的机器上编译。我得到了以下错误:
应该是标识符,但找到了“implicit”。
@JohnDoe您必须创建一个
包对象
这是一个很好的解决方案,但建议您明智地使用implicit,因为它会使代码变得非常复杂。@JohnDoe。。。请现在检查