アクションを合成するカスタムアノテーションを作成し、そこに、アクションが完了した後に実行される処理を記述します。
つまり、「アクションが終わった後に処理が実行されるアクション」を作成し、任意のコントローラーのメソッドに合成します。
※正しい(推奨されている)書き方なのかどうか自信はありませんが……
ソース
HogeController.java
package controllers;
import javax.inject.Singleton;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.With;
@Singleton
public class HogeController extends Controller {
@With(HogeAction.class)
public Result index() {
System.out.println("--------------------------");
System.out.println("HogeController.index");
System.out.println("--------------------------");
return ok();
}
}
HogeAction.java
package controllers;
import java.util.concurrent.CompletionStage;
import play.mvc.Action;
import play.mvc.Http.Context;
import play.mvc.Result;
public class HogeAction extends Action.Simple {
@Override
public CompletionStage<Result> call(Context ctx) {
System.out.println("before action");
return delegate.call(ctx)
.whenComplete((result, t) -> {
System.out.println("status:" + result.status());
System.out.println("after action");
});
}
}
実行結果
before action
--------------------------
HogeController.index
--------------------------
status:200
after action