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那么坑),所以先用着應該是可以的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM