2016-09-17 8 views
0

mehr Male in meinem Code verwende ich das folgende Muster eine versagende Zukunft zu erholen:Wie man den Status von Play in Scala einkapselt?

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

ich jetzt nach einer Möglichkeit suchen, dieses Verhalten, um zu kapseln Code-Duplizierung zu entfernen. Ich habe versucht, es in eine Klasse zu wickeln, aber seltsamerweise kann ich InternalServerError innerhalb der apply Methode nicht auflösen.

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

Irgendeine Idee, wie ich das lösen kann? Wie gehe ich auch über den Parameter request?

Antwort

3

Code Wiederverwendung

Verwenden Sie implicit class, um die Funktionalität des Future zu erweitern und das implicit class innerhalb des package object oder Objekts zu setzen. Importieren Sie das Paketobjekt/Objekt und verwenden Sie den Code wann immer Sie es benötigen.

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

Vielen Dank! Ich mag diese Lösung wirklich. Dieser Code kompiliert jedoch nicht auf meiner Box. Ich erhalte den folgenden Fehler: 'identifier expected but 'implicit' found.'. –

+0

@JohnDoe Sie müssen ein 'Paketobjekt' erstellen – pamu

+0

Dies ist eine nette Lösung, aber Sie sollten implicts mit Bedacht verwenden, da es Ihren Code sehr kompliziert machen kann. –

1

Ich bin mir ziemlich sicher, dass Sie die apply Methode als Teil des Begleitobjekts verstanden haben, nicht die Klasse selbst.

Was das Problem mit der Auflösung, werden Sie es wie folgt importieren müssen:

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

Dann können Sie sich in einem Controller

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

als letzte Zeile tun Action

Verwandte Themen