最近在實踐Spring Boot 2+Spring Cloud(Finchley.M9),在用到Feign
的時候發現@EnableFeignClients
註解開不了,獨立使用Feign是可以的,但就是開啓不了Spring對Feign的支持.經過一番摸索終於把問題解決了,在這裏分享一下解決方案和思路.解決思路寫得較繁瑣,可以選擇性閱讀,結論和解決方案寫在前面
0. 結論和解決方案
Spring Cloud對Feign的支持由org.springframework.cloud:spring-cloud-netflix-core
移到org.springframework.cloud:spring-cloud-openfeign-core
下,而Finchley.M9
版本下的spring-cloud-starter-openfeign:2.0.0.M2的pom依賴文件中導入的是spring-cloud-netflix-core
而非spring-cloud-openfeign-core
,需要我們在pom文件中添加對應依賴管理使spring-cloud-starter-openfeign版本更新到2.0.0.RC1
,如下圖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1. 創建項目
爲了方便講解分析,這裏使用idea創建一個新的SpringBoot+Spring Cloud的Feign項目,一切設置保持默認
項目依賴僅勾選Web和Feign
下面貼出項目初始化的pom文件的依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
這個時候可以看到在主程序上用不了@EnableFeignClients
註解
2. @EnableFeignClients的位置
問題很明顯就是缺少包了,那就先找找@EnableFeignClients是在哪個包裏,利用idea的工具,可以看到該註解是在
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
將其導入pom,查看import信息,這個時候@EnableFeignClients註解的全限定名是org.springframework.cloud.netflix.feign.EnableFeignClients
(重要,後面會提到)
試一下啓動,意料之中地報錯了,錯誤是org.springframework.beans.factory.BeanDefinitionStoreException
不過這並不要緊,重要是找到了@EnableFeignClients註解在哪裏,現在把剛纔pom添加的依賴去掉再來看看項目原本的依賴樹
可以看到項目本來就有org.springframework.cloud:spring-cloud-netflix-core:2.0.0.M8
.
那是不是說明2.0.0.M8
中沒有@EnableFeignClients註解而1.3.5.RELEASE
有呢?很有可能,筆者特地去找了這兩個jar包,解壓後比較如下:
很直觀地看到,Spring Cloud的spring-cloud-netflix-core版本中少了很多東西,其中就包括Feign文件夾,而我們要的@EnableFeignClients和@FeignClient註解就在這個文件夾下
到這裏問題已經很清晰了,高版本的Spring Cloud使用的Feign註解不在原來的位置,也不在spring-cloud-openfeign下,所以自然就找不到了
那新的問題又來了,高版本的Spring Cloud使用的Feign註解在哪裏,又該如何導入呢?
這裏還是從官方提供的依賴入手,下面是官方提供的OpenFeign Quick Start最新教程
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies><repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
如上,與項目原本的pom相比,就只是在dependencyManagement(聲明依賴,並不實現引入)下多了個org.springframework.cloud: spring-cloud-openfeign:2.0.0.RC1
的dependency版本管理.將其引入,即在pom文件中增加如下內容
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
發現@EnableFeignClients
沒有提示錯誤了,這時候再來看看項目依賴樹
對比一下上面M2版本的依賴樹,可以很明顯地看到與Feign相關的依賴包的變化是org.springframework.cloud:spring-cloud-netflix-core
換成了org.springframework.cloud:spring-cloud-openfeign-core
直接看一下import信息,發現註解的類名爲org.springframework.cloud.openfeign.EnableFeignClients
,與上面看到的做對比,就可以發現@EnableFeignClients
註解由org.springframework.cloud.netflix.feign.EnableFeignClients
換爲org.springframework.cloud.openfeign.EnableFeignClients
即在M2版本中@EnableFeignClients的類已經換了,但對應的spring-cloud-starter-openfeign下的依賴卻沒有更新,所以就找不到對應的類了
知道原因,那我們再來看看org.springframework.cloud:spring-cloud-openfeign-core
這個包的內容
對比一下上面org.springframework.cloud:spring-cloud-netflix-core的內容,就會發現兩者幾乎一樣,這也驗證了我們的想法
由此,我們可以得出結論:
Spring Cloud對Feign的支持由org.springframework.cloud:spring-cloud-netflix-core
移到org.springframework.cloud:spring-cloud-openfeign-core
下,而Finchley.M9
版本下的spring-cloud-starter-openfeign:2.0.0.M2的pom依賴文件中導入的是spring-cloud-netflix-core
而非spring-cloud-openfeign-core
,需要我們在pom文件中添加對應依賴管理使spring-cloud-starter-openfeign版本更新到2.0.0.RC1
3. 官方項目日誌
最後,再來看看官方項目日誌(可以直接去github上面看):
呃,2.0.0.M2和2.0.0.RC1都被回滾了…,現在用的還是2.0.0.BUILD-SNAPSHOT,不過現在(2018年4月25日)官方教程給的current版本是2.0.0.RC1,而且目前沒發現問題(至少不會像2.0.0.M2那麼坑),所以先用着應該是可以的