2017-01-14 2 views
0

Я использую 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()); 

Мне не нравится, есть ли лучший способ?

ответ

0

Во-первых изменить ваш совет взять аннотацию в качестве дополнительного аргумента:

public void profile(
    ProceedingJoinPoint jointPoint, 
    ExecutionMethodProfiler methodProfiler 
) throws Throwable {} 

Затем связать аннотацию к этому аргументу в вашем срезе точек:

<aop:around 
    pointcut="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(methodProfiler)" 
    method="profile" 
    arg-names="methodProfiler" 
/> 

я фактически не проверить это, потому что я Сейчас я немного занят, но в основном это работает.

+0

Я пробовал, и я получаю ошибку: Вложенное исключение - java.lang.IllegalArgumentException: ошибка в :: 0 формальная несвязанная в pointcut – Breakidi

+0

Я обновил свой ответ, чтобы сначала иметь параметр точки соединения в сигнатуре метода , В AspectJ это может быть первый или последний параметр, но, возможно, Spring здесь более придирчив. Кроме того, убедитесь, что имя параметра одинаково везде: pointcut, arg-names и подпись метода. В противном случае это не может быть связано. – kriegaex

+0

Если я обновляю тон метода, я получаю это исключение: Конструктор выбрал исключение; Вложенное исключение - это java.lang.IllegalStateException: ожидая найти 2 аргумента для привязки по имени в совете, но на самом деле найдено 1 аргумент. – Breakidi

Смежные вопросы