【问题标题】:Spring Cloud Feign UnsatisfiedDependencyExceptionSpring Cloud Feign UnsatisfiedDependencyException
【发布时间】:2022-04-09 06:38:59
【问题描述】:

Spring Cloud Feign 错误:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“feignController”的bean时出错:通过字段“feignService”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.study.base.microservices.service.BookFeignClient' 的 bean 时出错:FactoryBean 在创建对象时抛出异常;嵌套异常是 java.lang.IllegalStateException: No Feign Client for loadBalancing 定义。你忘了包括 spring-cloud-starter-ribbon 吗? 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 在 org.study.base.microservices.FeignClient.main(FeignClient.java:19) [classes/:na] 原因:org.springframework.beans.factory.BeanCreationException:创建名为“org.study.base.microservices.service.BookFeignClient”的bean时出错:FactoryBean在创建对象时抛出异常;嵌套异常是 java.lang.IllegalStateException: No Feign Client for loadBalancing 定义。你忘了包括 spring-cloud-starter-ribbon 吗? 在 org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1316) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1282) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] ...省略了19个常用框架 原因:java.lang.IllegalStateException:没有定义负载平衡的假装客户端。你忘了包括 spring-cloud-starter-ribbon 吗? 在 org.springframework.cloud.netflix.feign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:148) ~[spring-cloud-netflix-core-1.3.5.RELEASE.jar:1.3.5.RELEASE] 在 org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:166) ~[spring-cloud-netflix-core-1.3.5.RELEASE.jar:1.3.5.RELEASE] 在 org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] ...省略了29个常用框架

BookFeignClient.java

@FeignClient(name="book-service")
public interface BookFeignClient {

    @RequestMapping("book/view/{id}")
    public Book viewBook(@RequestParam("id") String id);

}

FeignController.java

@RestController
public class FeignController {

    @Autowired
    private BookFeignClient feignService;

    @GetMapping("feign/view/{id}")
    public Book viewBook(@PathVariable String id) {
        return feignService.viewBook(id);
    }
}

FeignClient.java

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignClient {
    public static void main(String[] args) {
        SpringApplication.run(FeignClient.class, args);
    }
}

application.yml

server:
  port: 8020
spring:
  application:
    name: micro-feign-client
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    preferIpAddress: true
ribbon:
  eureka:
    enabled: true

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

版本:Dalston.SR4

我该如何解决这个问题?

【问题讨论】:

  • 我的帖子又更新了一点。试试这是否能解决您的问题。

标签: java spring


【解决方案1】:

我最近遇到了同样的错误,用spring boot 2.0.3.RELEASE

当我先添加openfeign依赖时,没有版本,我发现Maven没有拉下依赖(不知道为什么)。

所以我必须为 maven 明确定义版本才能实际提取它。有了这个,我也得到了spring-cloud-starter-Netflix-ribbon

此时,当我启动服务器时,我得到了与第一篇文章中指定的相同的错误。

在 pom 中添加带有版本的spring-cloud-starter-Netflix-ribbon 依赖后,错误得到解决。所以我最终添加了这两个依赖项:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency> 
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

【讨论】:

【解决方案2】:

在您的pom.xml 中添加ribbon 依赖项。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

我还发现您的BookFeignClient 存在一些差异。应使用@PathVariable 代替@RequestParam

@FeignClient(name="book-service")
public interface BookFeignClient {

    @RequestMapping("book/view/{id}")
    public Book viewBook(@PathVariable("id")  String id);

}

【讨论】:

  • 看我的回答,因为类名和feign注解一样,有点冲突
【解决方案3】:
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignClient {

    public static void main(String[] args) {
        SpringApplication.run(FeignClient.class, args);
    }
}

改成

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignClient.class, args);
    }
}

现在可以了

【讨论】:

  • 理想情况下,如果您为包提供了完全限定的类名,那么类名 FeignClient 也应该可以工作,因为我假设您的包名必须与 @FeignClient 接口的包名不同。无论如何,通过更改类名它可以工作。太好了……
【解决方案4】:

我正在做一个爱好项目,这是我的观察

我关注了这个网址issue on Feign,同样来自related question and answer from Abduqoidir

我已经更改了我的 spring boot 项目版本

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

并将spring cloud版本改为

        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>

【讨论】:

    【解决方案5】:

    尝试在您的应用程序类中添加以下代码,即 FeignClient :

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    

    然后检查。

    另外我认为你的

      @GetMapping("feign/view/{id}")
        public Book viewBook(@PathVariable String id) { // pertaining to feign Controller 
    

    应该替换为:

     @RequestMapping("book/view/{id}")
     public Book viewBook(@RequestParam("id") String id);
    

    【讨论】:

    • 看我的回答,因为类名和feign注解一样,有点冲突
    【解决方案6】:

    将接口BookFeignClient更改为以下版本,更改后Spring不需要平衡。

    @FeignClient(name="book-service", url = "https://meu.dominio.com")
    public interface BookFeignClient {
    
        @RequestMapping("book/view/{id}")
        public Book viewBook(@PathVariable("id")  String id);
    }
    

    【讨论】:

    • 如果他使用的是命名服务器,这意味着他不想对域进行硬编码。但你是对的,这种方式有效,不需要负载平衡
    【解决方案7】:

    我认为您应该在代理中添加以下注释:

    @FeignClient(name="book-service")
    @RibbonClient(name="external-service-name") // this is missing, the name of the external service registered in your naming server
    public interface BookFeignClient {
    ...
    

    【讨论】:

      【解决方案8】:
      Adding below dependency should solve the issue:
      
      <!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-slf4j -->
      <dependency>
          <groupId>io.github.openfeign</groupId>
          <artifactId>feign-slf4j</artifactId>
          <version>9.3.1</version>
      </dependency>
      
      Chose compatible version while adding. This dependency already present with-in the spring-cloud-openfeign-core but for some reason it does not get pulled.
      

      【讨论】:

        【解决方案9】:

        添加以下 Maven 依赖项帮助我解决了这个问题-

        <dependency>
            <groupId>io.github.openfeign.form</groupId>
               <artifactId>feign-form</artifactId>
            <version>3.4.1</version>
        </dependency>
        

        【讨论】:

          猜你喜欢
          • 2015-08-24
          • 2017-07-23
          • 2018-06-14
          • 2015-10-21
          • 2018-08-31
          • 2015-06-08
          • 2018-04-01
          • 2016-06-25
          • 2017-07-28
          相关资源
          最近更新 更多