web-dev-qa-db-ja.com

注釈パラメータを使用したaspectjポイントカット

@Profile(description="something")でアノテーションが付けられたメソッドをインターセプトするためにaspectjを使用しています

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Profile {
    public String description() default "";
}

@Around("com.merc.aop.ctw.aspect.PointcutDefinitions.logAnnotatedMethods(profile)")
public Object profile(ProceedingJoinPoint pjp, Profile profile) throws Throwable {
    ....
}

@Pointcut("@annotation(com.merc.annotations.Profile)")
protected void logAnnotatedMethods(Profile profile) {
}

しかし、AJCを使用してコンパイルしているときに、次のエラーメッセージが表示されます

formal unbound in pointcut 
15
user373201
_@Pointcut("@annotation(com.merc.annotations.Profile)")
protected void logAnnotatedMethods(Profile profile) {
}
_

これは正しくありません。@annotation()はパラメータタイプではなくパラメータ名を必要としています。

クラスがデバッグコードでコンパイルされている場合、ポイントカットパラメータはメソッドパラメータと同じ名前である必要があります。そうでない場合は、一意のパラメータタイプに依存するか、argNamesパラメータを使用してパラメータ名を明示的に書き出す必要があります。

_@Pointcut(value="@annotation(profile)",argNames="profile")
protected void logAnnotatedMethods(Profile arg) {    }
_

参照:

19

私は遊んでいて、次のことがうまくいったことがわかりました

@Pointcut("@annotation(profile)")
protected void logAnnotatedMethods(Profile profile) {
}
6
user373201