本文介紹了如何創建切入點來偽裝支持接口繼承的客戶端?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在一個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。我創建了一個方面,它包裝了用MyAnnotation
注釋的對象的所有公共方法
@Around("@within(MyAnnotation) && execution(public * *(..))")
public Object myWrapper(ProceedingJoinPoint invocation) throws Throwable {
// ...
}
它工作正常,所有調用都會被截獲,直到我嘗試將MyAnnotation
放在使用feign接口繼承的feign客戶端上。當我使用繼承的接口調用初始化我的客戶端時,不再被攔截。
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.*(..))"
刪除了上一個問題,但給出了另一個問題,如某些Bean沒有名稱無法實例化等。
問題是如何在不將@MyAnnotation
移動到基本接口FeignClientInterface
的情況下使其工作。它在另一個項目中,我無法控制它。
推薦答案
好的,經過幾個小時的調查,我用這個替換了我的切入點
@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")
如前所述here我使用execution
只是為了避免創建代理。
這篇關于如何創建切入點來偽裝支持接口繼承的客戶端?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,