Spring Boot 2下使用Feign找不到@EnableFeignClients的解決辦法

最近在實踐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項目,一切設置保持默認

項目依賴僅勾選WebFeign
這裏寫圖片描述
下面貼出項目初始化的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.M22.0.0.RC1都被回滾了…,現在用的還是2.0.0.BUILD-SNAPSHOT,不過現在(2018年4月25日)官方教程給的current版本是2.0.0.RC1,而且目前沒發現問題(至少不會像2.0.0.M2那麼坑),所以先用着應該是可以的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章