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"))
}
}
在我的代码中多次使用以下模式来恢复失败的未来:
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"))
}
}