2017-01-27 1 views
0

私はStackoverflowで同じタイプの質問があることは知っていますが、これらのすべてがScalaで書かれています。 the official documentationに、Actionの作成方法が表示されます。 は、実際に私はそれの明確ではないけど、Play Javaでのアクションの作成

public class VerboseAction extends play.mvc.Action.Simple { 
public CompletionStage<Result> call(Http.Context ctx) { 
    Logger.info("Calling action for {}", ctx); 
    return delegate.call(ctx); 
} 

この上記のコードは、以下のいずれかと同じですか?

@With(VerboseAction.class) 

public Result verboseIndex() { 
    return ok("It works!"); } 

そして、私たちはラップされたアクションに委任する必要がありますが、上記のコードではどのアクションが呼び出されていますか? delegate.call(ctx)の意味は? 私はPlayのアクションがActionのインスタンスであることを知っていますが、戻り値は実際にはであり、Actionではありません。
だから私は混乱しています。たぶん私には小さな誤解があるので、誰もそれを指摘することができますか?

ありがとうございました。

答えて

0

私は質問で、質問に答えることをしようとします:

この上記のコードは以下の1と同じですか?

いいえ、実際には両方のアクションを「with」アノテーションで構成しています。

しかし、上記のコードではどのような動作が呼び出されていますか?

アクションは、受信したリクエストに対する応答を処理するプロセスです。 このアクションは、このメソッドへの要求が受け取るたびに呼び出されます(要求はルートファイル内のメソッドにマップされます)。

そして、私たちはラップされたアクションに委任しなければならないと書いています。 delegate.call(ctx)とは何ですか?

デリゲートは、次のとおりです。

/** 
* The wrapped action. 
*/ 
"public Action<?> delegate;" 

と呼び出しがある:Actionクラスで

/** 
* Executes this action with the given HTTP context and returns the result. 
*/ 
"public abstract Promise<Result> call(Context ctx) throws Throwable" 

。 delegate.callは、アクションでパラメータをラップし、結果を返すことを意味します。

私はPlayのアクションがActionのインスタンスであることを知っていますが、戻り値は実際はActionではなくCompletionStageです。

CompletionStageは実際には「パブリックインターフェイスCompletionStage」 そのドキュメントがそれを記述する:

アクションを実行するか、別のCompletionStageが完了値を計算する可能性非同期計算、段階。 ステージの計算が終了するとステージが完了しますが、 は他の依存ステージをトリガします。このインタフェースで を定義された機能は、使用スタイルの範囲をキャプチャする に方法の大きなセットを展開するだけいくつかの基本的な形式をとる:

ステージによる演算が 関数として表すことができます、応じて、消費者、またはRunnableを(名前はそれぞれ、が実行、またはを受け入れ、適用 を含むとメソッドを使用して) それは引数が必要および/または結果を生成するかどうか。 たとえば、{@code stage.thenApply(x - > square(x))thenAccept(x - > System.out.print(x))。thenRun(() - > System.out.println()) }。 追加フォーム()は、その結果ではなく、ステージ の機能を適用します。

この

「アクションを実行または が別CompletionStageが完了する値を計算する可能性非同期計算、段階。」

"ステージによって実行される計算は関数、 消費者、またはRunnableをとして表すことができる" とは、機能、消費者、またはそのRunnableをであることをクリア何らかの計算を実行する。実際にアクションを作成して返しています。

return ok("It works!"); 

CompletionStageではありません。

+0

詳細な回答ありがとうございます!しかし、あなたは私に膨大な量の情報を渡しましたが、自分ではリンクしていません。最初のコードは何を意図していますか? –

+0

delegateとcallの説明、delegateはActionクラスのフィールドであり、callはActionクラスのメソッドです。 –

+0

今私は、他の私の質問を組み合わせて、全体の画像をほとんど把握しています。私の質問では、 'delegate.call(ctx)'は何をしますか? 'delegate'はActionクラスのフィールドであり、' call'は 'Promise 'を返すメソッドです。これはすぐに' Result'になります。それで、実際に何をしていますか? –

0

Actionは、Result(最終的に)を提供する作業単位です。あなたの最初のコードブロックは、Actionを構築してlog文を実行し、Actionユニット(別の注釈またはコントローラメソッドのいずれか)を実行して呼び出し、コンテキストを渡してdelegateの呼び出しを返します全体の時間に沿って。

質問の最後の部分で誤解されているのは、コールの戻り値のタイプが次のActionではないことです。 Actionの(最終的な)Resultです。

+0

あなたの説明では、「アクション」は作業単位です。したがって、 'call(Http.Context ctx)'は 'delegate.call(ctx)'と似ていますが、どちらも 'Action'ですか?正確に 'デリゲート 'とは何ですか? Playの内部クラスは 'Controller'に関連していますか?あなたの答えを前提に、 'Result'となるインスタンスは、最後に' CompletionStage 'ですか? –

+0

@KazuyaTomita 'delegate'は次の' Action'であり、 'call'メソッドを呼び出す前にPlayによって設定されます。 'delegate.call(ctx)'はコンテキストで次の 'Action'を呼び出します。 – gpgekko

+0

'delegate.call(ctx)'の戻り値は 'Promise 'であり、 'Action'ではありません。あなたはどうやって説明しますか? –

関連する問題