Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 2.4.x.

§アクションの合成

この章では汎用的なアクションを定義するための方法をいくつか紹介します。

§アクションのおさらい

前のページで、アクションとは play.mvc.Result 値を返す Java のメソッドだということを説明しました。より正確には、Play はアクションを内部的には関数として管理しています。しかし、Java は第一級オブジェクトとしての関数をサポートしていないため、Java API では play.mvc.Action のインスタンスでアクションを定義します :

public abstract class Action {
  public abstract Promise<Result> call(Context ctx) throws Throwable;
}

Play は、適切なアクションメソッドを呼び出すルートアクションを生成します。これにより、もっと込み入ったアクションの合成を行うことができます。

§アクションを組み合わせる

VerboseAction の定義は以下の通りです。

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

@With アノテーションを利用すると、あるアクションメソッドのコードを他の play.mvc.Action と組み合わせることができます。

@With(VerboseAction.class)
public static Result verboseIndex() {
    return ok("It works!");
}

どこかのタイミングで delegate.call(...) を呼び出して、ラップされているアクションに処理を委譲する必要があることに注意してください。

カスタムアクションアノテーションを使って複数のアクションを合成することもできます:

@Security.Authenticated
@Cached(key = "index.result")
public static Result authenticatedCachedIndex() {
    return ok("It works!");
}

ノート: play.mvc.Security.Authenticatedplay.cache.Cached アノテーションやそれに対応するアクションは Play に同梱されています。詳しくは、関連する API ドキュメントを参照してください。

§独自のアクションアノテーションを定義する

アクションの合成を独自のアノテーションで行えるようにマークすることもできます。そのためには、アノテーション自身に @With アノテーションを付与してください。

@With(VerboseAnnotationAction.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface VerboseAnnotation {
    boolean value() default true;
}

この新しいアノテーションをアクションメソッドで利用するには、以下のようにします。

@VerboseAnnotation(false)
public static Result verboseAnnotationIndex() {
    return ok("It works!");
}

Action 側ではアノテーションを configuration として受け取ることができます。

public class VerboseAnnotationAction extends Action<VerboseAnnotation> {
    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        if (configuration.value()) {
            Logger.info("Calling action for " + ctx);
        }
        return delegate.call(ctx);
    }
}

§コントローラにアノテーションを付与する

アクションを合成するアノテーションは何でも Controller クラスに直接付与することができます。その場合、アノテーションはコントローラ内に定義された全てのアクションメソッドに適用されます。

@Authenticated
public Admin extends Controller {
    
  …
    
}

§アクションからコントローラへオブジェクトを引き渡す

コンテキスト引数マップを使ってアクションからコントローラへオブジェクトを引き渡すことができます。

Unable to find label security-action in source file code/javaguide/http/JavaActionsComposition.java

次ページ: コンテントネゴシエーション


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。