0

私は多くのビジネスロジックを持つコントローラを持っています。Action.asyncコードブロック内に移動したいと思います。このコードは、私がdocummentation、create a Future[Result]に関連する何かをチェックしてきたが、私はことはできないのです、私は別のクラス(サービス)Action.asyncの内部にあるコード?:プレイフレームワーク2.5コントローラからサービスへのAction.asyncロジックの移動

def tweetsnew(query: String) = Action.async { 
// Move From Here... 
credentials.map { 
    case (consumerKey, requestToken) => 
    ws.url("https://api.twitter.com/1.1/search/tweets.json") 
     .sign(OAuthCalculator(consumerKey, requestToken)) 
     .withQueryString("q" -> query) 
     .withQueryString("max_id" -> "833342796736167936") 
     .get().map { twitterResponse => 
     if (twitterResponse.status == 200) { 
     // Here There Are More Complex Logic 
     Ok("That is fine: "+twitterResponse.body) 
     } else { 
     throw new Exception(s"Could not retrieve tweets for $query query term") 
     } 
    } 
}.getOrElse { 
    Future.failed(new Exception("You did not correctly configure the Twitter credentials")) 
} 
//....To Here. To Another Class 
} 

に移動することができますどのように、作品関数がAction.asyncが期待するのと同じ型を返すようにします。

+0

ありがとうございます@vdebegue良い解決策です。私は別の解決策を提案したいと思います。 –

答えて

1

Action.asyncは、関数にコードを抽出し、Future[Result]

第一歩を返す関数を作成する必要があるので、Future[Result]の戻り値の型を期待:

object TwitterService { 
    def search(query: String, consumerKey: ConsumerKey, requestToken: RequestToken)(implicit ws: WSClient, ec: ExecutionContext): Future[Result] = { 
    // your code that make the ws call that returns Ok("...") 
    } 
} 

はその後、コントローラであなたの関数を呼び出します:

def tweetsnew(query: String) = Action.async { 
    credentials.map { 
    case (consumerKey, requestToken) => TwitterService.search(query, consumerKey, requestToken) 
    }.getOrElse { 
    // Better to send a bad request or a redirect instead of an Exception 
    Future.successful(BadRequest("Credentials not set")) 
    } 
} 
+0

ありがとう@vdebegue。私は別の解決策を提案したいと思います。 '@ImplementedBy(classOf [TwitterFeed]) 形質QueryTweets { デフqueryByWord(クエリ:文字列):将来[オプションが[JsValue] }' 2)形質を実装このようなサービスで形質を作成する サービスに、同じファイル( ":" YES "}" "" "" "{" changeByObject) 一部(aJsonResponse) 'クラスTwitterFeed @Injectは()QueryTweets { //複雑なコード Json.parseを拡張します} 3)コントローラー内: def tweetsnew(query:String)= Action.async { queryTweets.queryByWord(query).flatMap { case(応答)=> { Future.success foo(OK(応答)) } } } ' –

+1

これはまた、' WSClient'と 'ExecutionContext'にあなたの依存関係を注入することを好みます。あなたのやり方はもっと "java-ish" – vdebergue

関連する問題