2016-04-04 10 views
1

私はPlayFrameworkとjsonのlibを使用しています。Reads [未来[A]]を扱う方法

私は、デシリアライズのための非常に一般的な使用例を持っています。私は、DB内にIDの存在をチェックする必要があります。

誰でもReads[Future[T]]を使用するか、それとも悪い考えですか?トリックのようなものをやってコードのサンプルがある場合

は、私は、既存のコンビネータと遊ぶのがJsResult[Future[T]]Future[JsResult[T]]を変換する必要があるようだ...あなたは私が

def existenceReads[A](otherwise : ValidationError)(f: String => Future[Option[A]]) : Reads[Future[A]] = 
    Reads[Future[A]](js => StringReads.reads(js).flatMap { 
    v => f(v).map(_.fold(JsError(otherwise))(a => JsSuccess(a))) 
    }) 

をしたいコードの

例を知っていますか?

+0

このようにJSON逆シリアル化をデシリアライズしてもよろしいですか? JSONをオブジェクトにデシリアライズして見つけられたかどうかをチェックした場合、テストして理由を分かりやすくすることはできないでしょうか? – millhouse

答えて

1

私はあなたの質問を正しく理解しているかどうかはわかりませんが、プレイ中に先物を使っても問題ありません。

アクションはAction.asyncと定義でき、現在はFuture[Result]が必要です。あなたは将来を適切な結果にマッピングし、そのような未来を返すことができます。

例:

def checkId = Action.async { 
val jsResult = existenceReads(...) 
jsResult map { 
    case JsError(error) => BadRequest 
    case JsSuccess(val) => Ok 
} 
} 

タイプJsResult[Future[T]]は奇妙に聞こえます。 JsResultを生成する操作がある場合、先物で既に作業している場合は、非同期になると予想されます。

関連する問題