質問: ### 前提・実現したいこと ControllerでのRequest処理を行う前にAOPでチェックを行う為、判断情報を interfaceクラスに定義したメソッドで取得したい ### 発生している問題 Controllerクラスにinterfaceクラスをimplementsすると、@RequestMappingを認識しなくなる ### 該当のソースコード ``` @Controller public class MainController implements TestIF{ @RequestMapping(value="edit/test/001") public String test(@Valid Form form, BindingResult result) { return "../top.jsp"; } @Override public String getAuthority() { return "ほげほげ"; } } public interface TestIF { public String getAuthority(); } ``` ### 試したこと interfaceクラスをabstractクラスとした場合、望んだ通りの動作をしてくれました ### 補足情報(FW/ツールのバージョンなど) java8 Spring 4.1.6
回答: 自己解決しました。 そもそもの根本原因はAOPを有効した場合、Springが管理する全てのbeanがproxy化してしまう為でした。 proxy化には、「JDK dynamic proxy」と「CGLIB」の2パターンあり、インタフェースのあるクラスはJDKの方になってしまいます。 こちらになるとインタフェースクラスが主体になってしまうようで、そのため実装クラスに@Controllerや @RequestMappingを付けても認識してくれなくなっていました。 別件でAOPについて調べていたら、タグにproxy-target-class属性があり、これをtrueにすることでCGLIBに変更できる事を知り、無事解決しました。 参考URL: proxy化を行っているのが「DefaultAopProxyFactory#createAopProxy」なのを突き止めたので、これを差し替えようとアレコレ試行錯誤してたのですが、どうしても上手く行かず、諦めかけてました・・・。