SpringMVCで、@RequestMappingがついたメソッドの呼び出しをすべてインターセプトしたい場合は、この記述でOK。
import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; @Aspect public class RequestMappingInterceptor { @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)") public Object doRequestMappingIntercept(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature)pjp.getSignature(); //呼び出し先クラス Class targetClass = signature.getDeclaringType(); //呼び出し対象メソッド Method targetMethod = signature.getMethod(); return pjp.proceed(); } }
今回、呼び出されるControllerクラスのクラス名と、呼び出しメソッドを使って制御を行いたいと思い、呼び出ししてるところを調べてみた。
アノテーションベース開発の場合、@Controllerのクラス呼び出しはorg.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterが行う。
しかしながら、このクラスはprivateのメソッドとprivateのインナークラスで固められており、実質コピーベースでしか拡張できない。
従って今回は拡張をやめて、AOPで解決することにした。
ほんとはメソッド引数オブジェクトの解決機能も拡張したかったが、これはAOPだとできないので今回はあきらめた。
ここらへんがもう少しブラガブルだとありがたいのだが。