aspectj pointcut с параметрами аннотации - PullRequest
13 голосов
/ 07 февраля 2011

Я использую aspectj для перехвата методов, помеченных @Profile(description="something")

@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 

Ответы [ 2 ]

18 голосов
/ 07 февраля 2011
@Pointcut("@annotation(com.merc.annotations.Profile)")
protected void logAnnotatedMethods(Profile profile) {
}

Это не правильно, @annotation() хочет имя параметра, а не тип параметра.

Если ваш класс скомпилирован с помощью кода отладки, параметр pointcut должен иметь то же имя, что и параметр метода, если нет, вам нужно либо полагаться на уникальность типов параметров, либо явно записывать имена параметров с помощью argNames параметр:

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

Ссылка:

5 голосов
/ 07 февраля 2011

Я играл и обнаружил, что следующее работает

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