Как создать pointcut для симуляции клиента, который поддерживает наследование интерфейса? - PullRequest
0 голосов
/ 24 апреля 2020

В проекте Spring Boot у меня есть простой симулированный клиент

@MyAnnotation
@FeignClient(name="some-name", url="http://test.url")
public interface MyClient {
    @RequestMapping(method = RequestMethod.GET, value = "/endpoint")
    List<Store> getSomething();
}

Мне нужно перехватить все вызовы, и для этого я создаю общую библиотеку, которая может использоваться в разных проектах. Для этого я стараюсь использовать Spring AOP. Я создал аспект, заключающий в себе все методы publi c объекта, помеченного MyAnnotation

@Around("@within(MyAnnotation) && execution(public * *(..))")
public Object myWrapper(ProceedingJoinPoint invocation) throws Throwable {
   // ...
}

. Он работает правильно, и все вызовы перехватываются, пока я не попытался установить MyAnnotation на симулированном клиенте, который использует наследование для симулируемых интерфейсов. Когда я запускаю мой клиент с унаследованными интерфейсными вызовами, он больше не перехватывается.

public interface FeignClientInterface {
    @RequestMapping(method = RequestMethod.GET, value = "/endpoint")
    List<Store> getSomething();
}

@MyAnnotation
@FeignClient(name="some-name", url="http://test.url")
public interface MyClient extends FeignClientInterface{ 
}

Я пытался:

  • "@target(MyAnnotation) && execution(public * *(..))", но когда я подключил свою библиотеку к реальному проекту, я получил java.lang.IllegalArgumentException: Cannot subclass final class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages Кажется, что он хотел обернуть все в прокси и были заключительные классы.
  • "@target(MyAnnotation) && execution(public * com.my.company.base.package.*(..))" удалил предыдущую проблему, но дал другую, как, например, некоторые компоненты не могут быть созданы без имени, et c.

Вопрос в том, как заставить его работать без перемещения @MyAnnotation на базовый интерфейс FeignClientInterface. Это в другом проекте, и у меня нет контроля над ним.

1 Ответ

0 голосов
/ 25 апреля 2020

Хорошо, после нескольких часов исследования я заменил свой pointcut на этот

@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")

Как объяснено здесь Я использовал только execution, чтобы избежать создания прокси.

...