2016-11-13 11 views
0

にアクションを回すプレイ、私はタイプとコントローラの内部のオブジェクトを返しています:Scalaは2.5がプレイScalaのプロジェクトで結果

play.api.mvc.Action[play.api.libs.json.JsValueしかし、プレイはそれがplay.api.mvc.Resultを期待していることを不平を言っています。ドキュメントによれば、アクションはリクエストを処理して結果を生成する関数です。

def myController = mySpecialFunction.asyc(prase.tolerantJson) { implicit request => { 
     for { 
      ... do some stuff ... 
     } yield { 
      myFunction() 
     } 
    } 
} 

この場合、myFunctionの戻りタイプはplay.api.mvc.Action[play.api.libs.json.JsValueです。

は私が結果を返すようにしたい、と私は正しくrequestからFuture[Result]

+1

典型的には、アクションは、コントローラ内のトップレベルの機能(複数可)として定義するものです。 Playはアクションを呼び出してリクエストを渡し、結果を返すことを期待します。なぜあなたは変数 'myController'を持っていますか?通常は、コントローラを表すクラスがあり、そのクラス内でアクションを表すメソッドがいくつかあります。コードをそのまま動作させたいのであれば、 'myFunction'にリクエストを適用する必要があります - しかし、これはむしろ奇妙に見えます。 – rethab

+1

'myFunction'が何を高レベルで実行するかを見ればもっと助けてくれるでしょうか?あなた自身が述べているように、あなたの行動は同様に設計されていません。また、 'Action.async'は' Result'だけでなく 'Future [Result]'を返す必要があることにも注意してください。 – Nio

答えて

0

あなたAction.asyncブロックが機能を期待し、この関数を呼び出すするかどうかはわかりません。

myFunction()yieldブロック内にあり、戻りタイプはJsValueです。あなたの理解がFuturesにある場合、理解の出力はFuture[JsValue]になります。しかし、試合はFuture[Result]を期待しています。結果をFuture[Result]に変換します。したがって、最終出力タイプはFuture[Result]である必要があります。

あなたは、あるような問題を解決したい場合は、あなたがmyFunction()の結果に要求を渡すことができ

Action.async { req => 
    val resultFuture = 
    for { 
     _ <- getUsersFuture 
     _ <- doSomethingFuture 
    } yield (myFunction) 

    resultFuture.map { json => Ok(json) } 
} 
+0

'yield '内の' myFunction() 'の戻り値は' JsValue'だけでなく 'Action [JsValue]'です –

+0

私はそれが全体的な設計上の問題だと思います。 –

関連する問題