Как написать правильный pointcut для соответствия объекту, возвращающему интерфейс?

Я не знаю, возможно ли это, но я пытаюсь написать pointcut, который будет соответствовать любому методу, возвращающему объект, реализующий определенный интерфейс.

Учитывая следующее:

public class User implements Auditable{
   private int id;

   private String name;

   public String getName(){
      return name;
   }
}

и интерфейс Auditable:

public interface Auditable{
   public String getName();
}

И какой-то случайный класс:

public class RandomClass{
    public User getNewUser(){
       User u = new User();
       return u;
    }
}

Как я могу написать pointcut «AfterReturning», который будет перехватывать любой метод с именем getNew*, который реализует Auditable?

Следующие работы:

pointcut auditablePointcut(): call(public * *.getNew*(..))

однако это будет соответствовать любому возвращаемому типу. Не работает следующее:

pointcut auditablePointcut(): call(public Auditable *.getNew*(..))

Я предполагаю, что мог бы написать это с помощью if(), но это кажется немного неуклюжим (я еще не пробовал). Или есть более элегантный способ?


person Eric B.    schedule 29.11.2013    source источник


Ответы (2)


Я не уверен насчет pointcut, но вы можете проверить возвращаемый тип метода в таких аспектах:

MethodSignature signature = (MethodSignature)joinPoint.getSignature();
signature.getReturnType(); // method return type
person WelcomeTo    schedule 29.11.2013

person    schedule
comment
Не могли бы вы добавить некоторые пояснения? - person Undo; 02.12.2013
comment
after () returning (Audible au) будет соответствовать только точкам, которые возвращают Audible. au будет доступен как переменная в теле совета. - person aepurniet; 02.12.2013
comment
Почему это отличается от call(public Auditable *.getNew*(..))? Разве они оба не указывают на методы, которые возвращают Auditable? Или это соответствует точной сигнатуре метода, в то время как предлагаемое вами решение соответствует фактическому возвращаемому объекту? - person Eric B.; 03.12.2013
comment
call(public Audible...) соответствует подписи и не фиксирует возвращаемый объект (если только это не сделано в другом месте в pointcut). return(Audible) должен соответствовать и захватывать возвращаемый объект, но pointcut будет применяться ко всем getNew* методам, поскольку фильтрация по сигнатуре (кроме имени) отсутствует. - person aepurniet; 03.12.2013