1. 程式人生 > >Spring Boot 2下使用Feign找不到@EnableFeignClients的解決辦法

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

相關推薦

Spring Boot 2使用Feign到@EnableFeignClients解決辦法

最近在實踐Spring Boot 2+Spring Cloud(Finchley.M9),在用到Feign的時候發現@EnableFeignClients註解開不了,獨立使用Feign是可以的,但就是開啟不了Spring對Feign的支援.經過一番摸索終於把問題

spring boot 搭建框架錯誤: 到或無法載入主類

最近在學習spring boot相關知識,照著spring boot 官方網站新建了一個簡單的demo,啟動時卻一直報:找不到或無法載入主類,也沒有任何其他的提示資訊,這下咋辦?1、首先我去百度搜索了我這樣的情況,參考瞭如下這篇博文:        https://blog.

其他問題總結,容易出現,又解決辦法

1.之前有聲音,一拔一插耳機沒聲音 解決辦法:控制面板->硬體和聲音->Realtek高清音訊管理器 點選下圖資料夾 出現後點擊對號,點確定。重新插上耳機。 ok,看看能不能解決,反正我的解決了

Eclipse Git提交程式碼,多了一個“工程同名的資料夾”,解決辦法!!!

提交程式碼到Git倉庫,有2種方式。第1種,先在OSChina等平臺建立git專案,本地clone,再在本地修改程式碼提交。√這種方式,沒任何問題。不過,我平時不喜歡這麼幹。第2種,本地已經有了專案,需要提交到git上。×分享程式碼到Git遠端倉庫的時候,本地首先需要建立本地

springboot工程maven打包時,如果有依賴工程總是報到,解決辦法

引用原文: 原文地址   最近公司使用springboot開發專案,使用的構建工具是maven,專案分了很多模組,並且模組之間還存在一定的依賴,比如說一個專案common是提供各專案通用的工具類,公共的類等例子:專案root,有module common,front,mall

使用cardview 屬性解決辦法

CardView也是5.0的新控制元件,這控制元件其實就是一個卡片,當然我們自己也完全可以定義這樣一個卡片,從本質上看,可以將CardView看做是FrameLayout在自身之上添加了圓角和陰影效果。請注意:CardView被包裝為一種佈局,並且經常在List

vmware,virtualbox 虛擬機器Linux系統複製或克隆後網路連上,網絡卡解決辦法

現在很多Linux發行版使用udev動態管理裝置檔案,並根據裝置的資訊對其進行持久化命名. udev會在系統啟動過程中識別網絡卡,將MAC地址和網絡卡名稱對應起來記錄在udev規則檔案中. /etc/udev/rules.d/*-net.rules CentOS: 70-p

Spring Boot 2.4.0正式釋出,全新的配置檔案載入機制(相容)

> 千里之行,始於足下。關注公眾號【**BAT的烏托邦**】,有Spring技術棧、MyBatis、JVM、中介軟體等小而美的**原創專欄**供以免費學習。分享、成長,拒絕淺嘗輒止。本文已被 [**https://www.yourbatman.cn**](https://www.yourbatman.cn)

阿裏P9告訴你 Spring Boot 2.0正式發布,升還是升呢?

Java spring spring Boot Spring帝國Spring幾乎是每一位Java開發人員都耳熟能詳的開發框架,不論您是一名初出茅廬的程序員還是經驗豐富的老司機,都會對其有一定的了解或使用經驗。在現代企業級應用架構中,Spring技術棧幾乎成為了Java語言的代名詞,那麽Spring

spring-boot-2.0.3一樣系列之源碼篇 - run方法(二)之prepareEnvir

config ace let fff 輸出 cloud 通過 什麽事 來看 前言  此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可以挑些自己感興趣或者對自己有

spring-boot-2.0.3一樣系列之源碼篇 - run方法(三)之createApplicationContext,絕對有值得你看的地方

處理 gen 利用反射 mva 默認 .get war close -s 前言   此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可以挑些自己感興趣或者對自己有

spring-boot-2.0.3一樣系列之源碼篇 - run方法(四)之prepareContext,絕對有值得你看的地方

release led 設置 get handler htm encoding 列表創建 splay 前言   此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可

spring-boot-2.0.3之redis快取實現,是你想的那樣哦!

前言   開心一刻     小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當

spring-boot-2.0.3之redis快取實現,是你想的那樣哦

前言  開心一刻     小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當我超

Spring Boot 2程式能載入 com.mysql.jdbc.Driver 問題

用Spring Boot Starter 嚮導生成了一個很簡單SpringBoot程式, 用到了 MySQL, 總是下面不能載入 Mysql driver class 錯誤.  Cannot load driver class: com.mysql.jdbc.Driver  

spring-boot-2.0.3一樣系列之原始碼篇 - 階段總結

前言   開心一刻     朋友喜歡去按摩,第一次推門進來的是一個學生美眉,感覺還不錯;後來經常去,有時是護士,有時是空姐,有時候是教師。昨天晚上推門進去的是一個女警察,長得賊好看,身材也很好,朋友嗷的一聲就撲上去了。然後他就被抓起來了,罪名是:嫖娼、襲警、強姦未遂。   路漫漫其修遠兮,吾將上下而求索

spring-boot-2.0.3一樣系列之源碼篇 - 階段總結

led gpo otl 開始 ted source rand java類 nal 前言  開心一刻     朋友喜歡去×××,第一次推門進來的是一個學生美眉,感覺還不錯;後來經常去,有時是護士,有時是空姐,有時候是教師。昨天晚上推門進去的是一個女警察,長得賊好看,身材也很好

Spring Boot 2.0 讀書筆記_04:MVC

2. MVC 下 驗證框架 關於驗證框架,之前很少用到, 在前端傳遞的引數中,前端框架已經存在一些驗證策略。比如:型別監測、長度監測、日期正則判斷等。因此在後端Controller層中的校驗就很少用到。但實際情況也可能存在有些惡意程式碼繞過前端驗證,直接向後端傳送請求這樣的

spring-boot-2.0.3一樣系列之番外篇

前言   還記得當初寫spring-session實現分散式叢集session的共享的時候,裡面有說到利用filter和HttpServletRequestWrapper可以定製自己的getSession方法,實現對session的控制,從而將session存放到統一的位置進行儲存,達到session共享的目

微服務 Spring Boot 2.0 + Spring cloud + consul + Hystrix + zuul + config + feign (四)

 系列文章: 你知道雪崩效應嗎? 在微服務架構中,最可怕的就是這樣的情況: 當一個基礎的服務(A )出現了問題,比如資料庫 提供資料的服務(B)就不可用, 隨著時間的推移, 取票服務(C) 服務呼叫提供資料的服務(B)介面時,請求超時,C服務不可用 整個微服務系