Я использую Spring AOP, как я могу получить значения из аннотаций, Вот мой аннотаций:Spring AOP получить значение аннотаций
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@Documented
public @interface ExecutionMethodProfiler
{
String value() default "defaultValue";;
}
вот мой XML:
<aop:aspectj-autoproxy/>
<aop:config>
<aop:aspect ref="methodProfiler">
<aop:pointcut id="serviceMethod"
expression="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(com.test.profiler.ExecutionMethodProfiler)" />
<aop:around pointcut-ref="serviceMethod" method="profile"/>
</aop:aspect>
</aop:config>
И это мой serviceMethod:
public void profile(ProceedingJoinPoint jointPoint) throws Throwable {}
как сейчас я могу получить значение, используя этот код:
MethodSignature signature = (MethodSignature) jointPoint.getSignature();
System.out.println(signature.getMethod().getAnnotation(ExecutionMethodProfiler.class).value());
Мне не нравится, есть ли лучший способ?
Я пробовал, и я получаю ошибку: Вложенное исключение - java.lang.IllegalArgumentException: ошибка в :: 0 формальная несвязанная в pointcut – Breakidi
Я обновил свой ответ, чтобы сначала иметь параметр точки соединения в сигнатуре метода , В AspectJ это может быть первый или последний параметр, но, возможно, Spring здесь более придирчив. Кроме того, убедитесь, что имя параметра одинаково везде: pointcut, arg-names и подпись метода. В противном случае это не может быть связано. – kriegaex
Если я обновляю тон метода, я получаю это исключение: Конструктор выбрал исключение; Вложенное исключение - это java.lang.IllegalStateException: ожидая найти 2 аргумента для привязки по имени в совете, но на самом деле найдено 1 аргумент. – Breakidi