Как написать Aspect pointcut на основе аннотированного параметра
У меня возникли некоторые проблемы при разработке способа создания pointcut, который будет работать с bean-компонентами, имеющими определенный аннотированный параметр. Моя конечная цель - проверить значение параметра до его обработки, но на данный момент мне просто нужно создать pointcut.
Рассмотрим следующую аннотацию
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER })
public @interface MyAnnotation {}
Затем я хотел бы применить это к ряду методов, таких как:
public void method1(@MyAnnotation long i) {}
public void method2(String someThing, @MyAnnotation long i) {}
public void method3(String someThing, @MyAnnotation long i, byte value) {}
Так
Мне все равно, какой класс (или пакет) методы вПоложение аннотированного аргумента будет различным.Я знаю, что аннотированное значение будет применяться только к определенному типуМоя реализация pointcut должна бытьчто-то вдоль линий:
@Before(value = "* *(..) && args(verifyMe)")
public void verifyInvestigationId(long verifyMe) {}
Я немного запутался в том, что именно@Before
Значение должно быть и как связать аннотацию и ее тип. На данный момент, вероятно, не стоит перечислять то, что я пробовал!
Обновить: На основе рекомендаций, которые я видел в http://stackoverflow.com/questions/3565718/pointcut-matching-methods-with-annotated-parameters/3567170#3567170 (и исправление нескольких недоразумений и добавление места, которое я пропустил) Я дошел до того, что работает следующее:
@Before("execution(public * *(.., @full.path.to.MyAnnotation (*), ..))")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("At least one of the parameters are annotated with @MyAnnotation");
}
Это почти то, что мне нужно - все, что мне нужно сделать, это передать значение аннотированного аргумента в качестве параметра методу. Я не могу понять синтаксис, чтобы заставить Spring сделать это (связанный ответ не показывает это).