2016-09-17 7 views
0

Несколько раз в течение моего кода я использую следующий шаблон для восстановления неисправного будущим:Как инкапсулировать статус Play в Scala?

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

Я теперь ищу способ, чтобы герметизировать это поведение, чтобы удалить дублирование кода. Я попытался обернуть его в классе, но, как ни странно, я не могу разрешить InternalServerError внутри метода apply.

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?

ответ

3

Код Повторное использование

Используйте implicit class для расширения функциональности Future и поместите implicit class внутри package 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")) 
    } 
} 
+0

Спасибо! Мне действительно нравится это решение. Однако этот код не компилируется на моем ящике. Я получаю следующую ошибку: «Идентификатор ожидаемый, но« неявный »найден.». –

+0

@JohnDoe вам нужно создать «объект пакета» – pamu

+0

Это приятное решение, но вам рекомендуется использовать implicits разумно, так как это может значительно усложнить ваш код. –

1

Я уверен, вы имели в виду метод 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) 

в качестве последней строки внутри контроллера Action