2015-03-12 3 views
2

Я столкнулся с странным поведением с использованием AspectJ для pointcut с использованием моей пользовательской аннотации.Аспект с использованием pointcut = @ аннотации для @AfterTrowing работает дважды

Задание Pointcut я использую:

@AfterThrowing(pointcut="@annotation(com.core.meta.NotifyOnFailure)", throwing="ex") 

У меня есть проблема в том, что мой аспект выполняется два раза, но если я изменить Pointcut к:

@AfterThrowing(pointcut="execution(* sendAndReceive(..))", throwing="ex") 

Он работает один раз, как и ожидалось.

Единственный метод, который я есть, что поднимает аспект заключается в следующем:

@NotifyOnFailure // I want to use this annotation to raise the aspect once 
    public String sendAndReceive(String serviceUrl) 
    { 
     String responseXml = "..."; 
     try 
     { 
      throw new Exception("test..."); 
     } 
     catch(Exception x) 
     { 
      ExternalExecutionException ex = new ExternalApiExecutionException("Service failed"); 
      throw ex; 
     } 
     finally 
     { 
      ... 
     }   

     return responseXml; 
    } 

Любая идея о том, почему мой аспект выполняется в два раза при использовании моего аннотаций и только один раз, когда я использую execution Pointcut?

ответ

7

Убедитесь, что вы также ограничиваете pointcut до исполнения. В противном случае это будет ограничено только аннотацией и, следовательно, будет использоваться как для , так и для вызова и . (если AspectJ может сообщить о вызове вашего метода, который он может, так как он находится в вашем собственном коде). Хорошее сравнение между обеими здесь: https://stackoverflow.com/a/18149106/2191746

Вашего срез точки будут выглядеть следующим образом:

@AfterThrowing(pointcut="execution(* *(..)) && @annotation(com.core.meta.NotifyOnFailure)", throwing="ex") 

Нет гарантию на синтаксисе, так как у меня нет компилятора AspectJ под руку.

+1

Большое спасибо за указание на это, вы очень помогли мне в этом. +1 –

+0

Нет проблем. Продолжайте грузоперевозки с AspectJ, это того стоит. :) – sheltem

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