2016-09-17 10 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"))) 
     } 

私は今、コードの重複を除去するために、この動作をカプセル化する方法を探しています。私はクラスでラップしようとしましたが、不思議なことに、InternalServerErrorapplyメソッドを解決できません。

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

内部の最後の行として

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

を行うことができますコード再利用

implicit classを使用してFutureの機能を拡張し、implicit classpackage 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)) 
    } 
} 

その後、あなたはコントローラAction

関連する問題