Как получить доступ к аннотации метода внутри совета, используя AspectJ? - PullRequest
0 голосов
/ 05 ноября 2018

Я создал аспект для перехвата определенных методов перед их выполнением следующим образом, используя AspectJ

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class SomeAspect {

    @Before("@annotation(com.test.package.MyCustomAnnotation)")
    public void validateSearchRestriction(final JoinPoint jp,
                           final MyCustomAnnotation annotation) {
        final String useCase = annotation.useCase();
    }
}

Пользовательская аннотация написана следующим образом

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

@Component
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface SecurityRestricted {
    String useCase();
}

Проблема, с которой я сталкиваюсь, связана со вторым аргументом в моем методе. Если я пытаюсь получить аннотацию в моем аспекте в качестве второго аргумента, приложение не запускается с приведенной ниже ошибкой.

Ошибка инициализации компонента; Вложенное исключение - java.lang.IllegalArgumentException: ошибка в формальном несвязанном состоянии :: 0 в pointcut

Вызвано: java.lang.IllegalArgumentException: ошибка при формальном освобождении :: 0 в pointcut в org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:301) ~ [aspectjweaver-1.8.0.jar: 1.8.0]

Если я уберу второй аргумент, мое приложение запустится нормально. Это правильный способ получить аннотацию метода?

1 Ответ

0 голосов
/ 09 ноября 2018

Если вы хотите связать переменные из pointcut с методом, вам нужно будет ссылаться на переменную из pointcut. Поэтому вместо написания @annotation(your.CustomAnnotation) вы должны написать @annotation(method-argument-name).

Так что в вашем случае ваш pointcut будет выглядеть как

@Before(“@annotation(annotation)”)
public void validateSearchRestriction(JoinPoint jp, MyCustomAnnotation annotation) { ... }
...