くちたと計算記

プログラミングのことを書きます

Spring で複数の ControllerAdvice を使うときは、一つのファイルに ControllerAdvice をまとめると見通しが良さそう

以下のような仕様のリクエスト共通処理を ControllerAdvice として実装しようと思いました。

  1. AuthenticationPrincipal に保存された情報をもとに、パッケージごとに Controller へのアクセス制御をおこなう。
  2. ページへのリクエストがあるたびに共通の処理を差し込む。

リクエストの共通処理で ControllerAdvice を書くと、 IDE でハンドラメソッド(@GetMapping などを付与したメソッド)と処理が分かれてしまうので、個人的には好きではありません。 それが複数ファイルに分かれると、さらに見通しが悪くなるんじゃないかと考えました。

そこで、一つのファイルにまとめてしまえば、見通しの悪さが改善されるのではないかと思いました。

public class ControllerAdviceConainer {
  @ControllerAdvive(basePackageClasses = Alpha.class)
  @Order(1)
  public static class AccessControlAlpha {
    @ModelAttribute
    public void method() {}
  }

  @ControllerAdvive(basePackageClasses = Beta.class)
  @Order(1)
  public static class AccesssControlBeta {
    @ModelAttribute
    public void method() {}
  }

  @ControllerAdvive(basePackageClasses = {Alpha.class, Beta.class})
  @Order(2)
  public static class Common {
    @ModelAttribute
    public void method() {}
  }
}

アクセス制御は Spring Security で実装すればよかったと実装し終わってから気づいたのは、ここだけの秘密です。 もっと上手いやり方があれば知りたいと思いました。