В проекте 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
. Это в другом проекте, и у меня нет контроля над ним.