AnnotationValidationInterceptorとAspectJ
GWボケがいまだ抜けないまま、相変わらずの仕事なさでStruts2いぢりを再開。
今回はAspectJアノテーションを使ってAOPをしてみる。
aspectの定義とか
XMLにPointcutやAdviceの定義はしないでアノテーションでやってみる。
Aspectを定義するクラスを作成する。
@Aspect public class TraceLogger { private static final Logger logger = Logger.getLogger(TraceLogger.class); @Pointcut("execution(* *..*Action.*(..))") public void tracePointCut() {} @Around("tracePointCut()") public Object trace(ProceedingJoinPoint pjp) throws Throwable { Object retVal; logger.debug("trace start:" + pjp.getTarget()); retVal = pjp.proceed(); logger.debug("trace end :" + pjp.getTarget()); return retVal; } }
適当にトレースログを出すてことで。
- @Aspect:アスペクト定義クラスですよと示すためのアノテーション
- @Pointcut:適用する箇所(ポイントカット)を定義する。空のメソッドを作成。
- @Around:指定したポイントカットでインターセプトして実処理の前後にログ出力をする。
Around以外にもBeforeとかあるけどサンプルだし。
Pointcutの指定を@Around("ここに指定")へ直接書いてもOK。
わざわざ@Pointcutで定義するのは複数の箇所で同じAdviceを適用するときに便利になるため、らしい。
いざ実行
が、動かない。
Daoパッケージにも仕込んであったんだけど、こっちは動いたのにActionに仕込んだほうは例外が発生してだめぽ。
例外をあげてるのが「AnnotationValidationInterceptor」。
バリデーションチェックを実行するかリフレクション使って(インターセプトした)アクションクラスのメソッドを取得するところでNoSuchMethodExceptionに。
ここにわたってくるActionクラスがAopProxyになってるらしくて呼び出せないみたい。
どうしたものかとSpring側のクラスをみるとJdkDynamicAopProxyのメンバAdvicedSupportが実参照の情報を持ってるみたいなんだけど…外からアクセスできないorz