<div id="content\_views" class="markdown\_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg> <p>最近在实践Spring Boot 2+Spring Cloud(Finchley.M9),在用到<code>Feign</code>的时候发现<code>@EnableFeignClients</code>注解开不了,独立使用Feign是可以的,但就是开启不了Spring对Feign的支持.经过一番摸索终于把问题解决了,在这里分享一下解决方案和思路.解决思路写得较繁琐,可以选择性阅读,结论和解决方案写在前面</p> <h2 id="0-结论和解决方案"><a name="t0"></a>0. 结论和解决方案</h2> <p>Spring Cloud对Feign的支持由<code>org.springframework.cloud:spring-cloud-netflix-core</code>移到<code>org.springframework.cloud:spring-cloud-openfeign-core</code>下,而<code>Finchley.M9</code>版本下的<strong>spring-cloud-starter-openfeign:2.0.0.M2</strong>的pom依赖文件中导入的是<code>spring-cloud-netflix-core</code>而非<code>spring-cloud-openfeign-core</code>,需要我们在pom文件中添加对应依赖管理使<strong>spring-cloud-starter-openfeign</strong>版本更新到<code>2.0.0.RC1</code>,如下图</p> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering" onclick="mdcp.signin(event)"><span class="hljs-tag"><<span class="hljs-title">dependencyManagement</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-openfeign<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>2.0.0.RC1<span class="hljs-tag"></<span class="hljs-title">version</span>></span> <span class="hljs-tag"><<span class="hljs-title">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-title">type</span>></span> <span class="hljs-tag"><<span class="hljs-title">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-title">scope</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencyManagement</span>></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h2 id="1-创建项目"><a name="t1"></a>1. 创建项目</h2> <p>为了方便讲解分析,这里使用idea创建一个新的SpringBoot+Spring Cloud的Feign项目,一切设置保持默认</p> <p>项目依赖仅勾选<strong>Web</strong>和<strong>Feign</strong> <br> <img src="https://img-blog.csdn.net/20180424205003499?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 下面贴出项目初始化的pom文件的依赖</p> <pre class="prettyprint" name="code"><code class="language-maven hljs xml has-numbering" onclick="mdcp.signin(event)"> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-starter-openfeign<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-title">scope</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencyManagement</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-dependencies<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>${spring-cloud.version}<span class="hljs-tag"></<span class="hljs-title">version</span>></span> <span class="hljs-tag"><<span class="hljs-title">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-title">type</span>></span> <span class="hljs-tag"><<span class="hljs-title">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-title">scope</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencyManagement</span>></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p>这个时候可以看到在主程序上用不了<code>@EnableFeignClients</code>注解 <br> <img src="https://img-blog.csdn.net/20180424210013470?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""></p> <h2 id="2-enablefeignclients的位置"><a name="t2"></a>2. @EnableFeignClients的位置</h2> <p>问题很明显就是缺少包了,那就先找找<strong>@EnableFeignClients</strong>是在哪个包里,利用idea的工具,可以看到该注解是在</p> <pre class="prettyprint" name="code"><code class="language-maven hljs xml has-numbering" onclick="mdcp.signin(event)"> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-netflix-core<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>1.3.5.RELEASE<span class="hljs-tag"></<span class="hljs-title">version</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p><img src="https://img-blog.csdn.net/20180424210520323?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 将其导入pom,查看import信息,这个时候@EnableFeignClients注解的全限定名是<code>org.springframework.cloud.netflix.feign.EnableFeignClients</code>(重要,后面会提到) <br> 试一下启动,意料之中地报错了,错误是<code>org.springframework.beans.factory.BeanDefinitionStoreException</code> <br> 不过这并不要紧,重要是找到了<strong>@EnableFeignClients</strong>注解在哪里,现在把刚才pom添加的依赖去掉再来看看项目原本的依赖树 <br> <img src="https://img-blog.csdn.net/20180424211505109?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 可以看到项目本来就有<code>org.springframework.cloud:spring-cloud-netflix-core:2.0.0.M8</code>. <br> 那是不是说明<code>2.0.0.M8</code>中没有<strong>@EnableFeignClients</strong>注解而<code>1.3.5.RELEASE</code>有呢?很有可能,笔者特地去找了这两个jar包,解压后比较如下: <br> <img src="https://img-blog.csdn.net/20180424212811291?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 很直观地看到,Spring Cloud的spring-cloud-netflix-core版本中少了很多东西,其中就包括Feign文件夹,而我们要的<strong>@EnableFeignClients</strong>和<strong>@FeignClient</strong>注解就在这个文件夹下 <br> <img src="https://img-blog.csdn.net/20180424213157751?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 到这里问题已经很清晰了,高版本的Spring Cloud使用的Feign注解不在原来的位置,也不在spring-cloud-openfeign下,所以自然就找不到了 <br> 那新的问题又来了,高版本的Spring Cloud使用的Feign注解在哪里,又该如何导入呢? <br> 这里还是从官方提供的依赖入手,下面是官方提供的<a href="https://cloud.spring.io/spring-cloud-openfeign/#quick-start" rel="nofollow" target="\_blank">OpenFeign Quick Start最新教程</a></p> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering" onclick="mdcp.signin(event)"><span class="hljs-tag"><<span class="hljs-title">dependencyManagement</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-openfeign<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>2.0.0.RC1<span class="hljs-tag"></<span class="hljs-title">version</span>></span> <span class="hljs-tag"><<span class="hljs-title">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-title">type</span>></span> <span class="hljs-tag"><<span class="hljs-title">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-title">scope</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencyManagement</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-starter-openfeign<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span><span class="hljs-tag"><<span class="hljs-title">repositories</span>></span> <span class="hljs-tag"><<span class="hljs-title">repository</span>></span> <span class="hljs-tag"><<span class="hljs-title">id</span>></span>spring-milestones<span class="hljs-tag"></<span class="hljs-title">id</span>></span> <span class="hljs-tag"><<span class="hljs-title">name</span>></span>Spring Milestones<span class="hljs-tag"></<span class="hljs-title">name</span>></span> <span class="hljs-tag"><<span class="hljs-title">url</span>></span>https://repo.spring.io/libs-milestone<span class="hljs-tag"></<span class="hljs-title">url</span>></span> <span class="hljs-tag"><<span class="hljs-title">snapshots</span>></span> <span class="hljs-tag"><<span class="hljs-title">enabled</span>></span>false<span class="hljs-tag"></<span class="hljs-title">enabled</span>></span> <span class="hljs-tag"></<span class="hljs-title">snapshots</span>></span> <span class="hljs-tag"></<span class="hljs-title">repository</span>></span> <span class="hljs-tag"></<span class="hljs-title">repositories</span>></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p>如上,与项目原本的pom相比,就只是在dependencyManagement(声明依赖,并不实现引入)下多了个<code>org.springframework.cloud: spring-cloud-openfeign:2.0.0.RC1</code>的dependency版本管理.将其引入,即在pom文件中增加如下内容</p> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering" onclick="mdcp.signin(event)"><span class="hljs-tag"><<span class="hljs-title">dependencyManagement</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-cloud-openfeign<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>2.0.0.RC1<span class="hljs-tag"></<span class="hljs-title">version</span>></span> <span class="hljs-tag"><<span class="hljs-title">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-title">type</span>></span> <span class="hljs-tag"><<span class="hljs-title">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-title">scope</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependencyManagement</span>></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p>发现<code>@EnableFeignClients</code>没有提示错误了,这时候再来看看项目依赖树 <br> <img src="https://img-blog.csdn.net/20180425183604686?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 对比一下上面M2版本的依赖树,可以很明显地看到与Feign相关的依赖包的变化是<code>org.springframework.cloud:spring-cloud-netflix-core</code>换成了<code>org.springframework.cloud:spring-cloud-openfeign-core</code></p> <p>直接看一下import信息,发现注解的类名为<code>org.springframework.cloud.openfeign.EnableFeignClients</code>,与上面看到的做对比,就可以发现<code>@EnableFeignClients</code>注解由<code>org.springframework.cloud.netflix.feign.EnableFeignClients</code>换为<code>org.springframework.cloud.openfeign.EnableFeignClients</code></p> <p>即在M2版本中@EnableFeignClients的类已经换了,但对应的spring-cloud-starter-openfeign下的依赖却没有更新,所以就找不到对应的类了</p> <p>知道原因,那我们再来看看<code>org.springframework.cloud:spring-cloud-openfeign-core</code>这个包的内容 <br> <img src="https://img-blog.csdn.net/20180425190526602?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 对比一下上面<strong>org.springframework.cloud:spring-cloud-netflix-core</strong>的内容,就会发现两者几乎一样,这也验证了我们的想法 <br> 由此,我们可以得出结论: <br> Spring Cloud对Feign的支持由<code>org.springframework.cloud:spring-cloud-netflix-core</code>移到<code>org.springframework.cloud:spring-cloud-openfeign-core</code>下,而<code>Finchley.M9</code>版本下的<strong>spring-cloud-starter-openfeign:2.0.0.M2</strong>的pom依赖文件中导入的是<code>spring-cloud-netflix-core</code>而非<code>spring-cloud-openfeign-core</code>,需要我们在pom文件中添加对应依赖管理使<strong>spring-cloud-starter-openfeign</strong>版本更新到<code>2.0.0.RC1</code></p> <h2 id="3-官方项目日志"><a name="t3"></a>3. 官方项目日志</h2> <p>最后,再来看看官方项目日志(可以直接去github上面看): <br> <img src="https://img-blog.csdn.net/20180425191406147?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsaW55dWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 呃,<strong>2.0.0.M2</strong>和<strong>2.0.0.RC1</strong>都被回滚了…,现在用的还是<strong>2.0.0.BUILD-SNAPSHOT</strong>,不过现在(2018年4月25日)官方教程给的current版本是<strong>2.0.0.RC1</strong>,而且目前没发现问题(至少不会像<strong>2.0.0.M2</strong>那么坑),所以先用着应该是可以的</p> </div>