如何封装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。。。请现在检查