4

Spring Cloud Feign Error:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'feignController': Unsatisfied dependency expressed through field 'feignService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.study.base.microservices.service.BookFeignClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-ribbon? at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] at org.study.base.microservices.FeignClient.main(FeignClient.java:19) [classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.study.base.microservices.service.BookFeignClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-ribbon? at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1316) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1282) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] ... 19 common frames omitted Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-ribbon? at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:148) ~[spring-cloud-netflix-core-1.3.5.RELEASE.jar:1.3.5.RELEASE] at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:166) ~[spring-cloud-netflix-core-1.3.5.RELEASE.jar:1.3.5.RELEASE] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] ... 29 common frames omitted

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>

Version: Dalston.SR4

How can i fix this ?

ℛɑƒæĿᴿᴹᴿ
  • 4,983
  • 4
  • 38
  • 58
Jeff Zhang
  • 51
  • 1
  • 1
  • 4

9 Answers9

12

I encountered the same error recently, with spring boot 2.0.3.RELEASE.

When I added openfeign dependency first, without the version, I found that Maven was not pulling down the dependency (not sure why).

So I had to define the version explicitly for maven to actually pull it. With that, I also got the spring-cloud-starter-Netflix-ribbon transitively.

At this point, when I started up the server, I got the same error specified in the first post.

After adding spring-cloud-starter-Netflix-ribbon dependency with the version in the pom, the error got resolved. So I ended up adding these 2 dependencies:

<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>
ℛɑƒæĿᴿᴹᴿ
  • 4,983
  • 4
  • 38
  • 58
Shravan Ramamurthy
  • 3,896
  • 5
  • 30
  • 44
  • 1
    I have tried adding ribbon dependency as well in my pom.xml but it didn't helped. I have posted question in stackoverflow https://stackoverflow.com/questions/63702885/java-lang-illegalstateexception-no-feign-client-for-loadbalancing-defined-did –  Sep 02 '20 at 11:01
3

Add ribbon dependency in your pom.xml.

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

I also see some discrepancy in your BookFeignClient. @PathVariable should be used in place of @RequestParam.

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

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

}
Soumitri Pattnaik
  • 3,246
  • 4
  • 24
  • 42
vsoni
  • 2,828
  • 9
  • 13
1
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignClient {

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

change to

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignClientApplication {

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

it work now

Jeff Zhang
  • 51
  • 1
  • 1
  • 4
  • Ideally the class name FeignClient should have also worked if you had provided a fully qualified class name with package, because your package name must be different with that of @FeignClient interface, I assume. Anyway by changing the class name it works. thats great... – vsoni Nov 27 '17 at 12:18
1

I am working on a Hobby project, Here is my observation

I have followed this url issue on Feign, also from related question and answer from Abduqoidir

I have changed my spring boot project version

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

and changed the spring cloud version to

        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
sri e
  • 49
  • 1
  • 5
0

Try to add following code in your application class i.e. FeignClient :

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

and then check.

Plus I think your

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

Should be replace with:

 @RequestMapping("book/view/{id}")
 public Book viewBook(@RequestParam("id") String id);
Pramod S. Nikam
  • 4,271
  • 4
  • 38
  • 62
0

Would change the interface BookFeignClient, to version that is below, after this change Spring will not require balancing.

@FeignClient(name="book-service", url = "https://meu.dominio.com")
public interface BookFeignClient {

    @RequestMapping("book/view/{id}")
    public Book viewBook(@PathVariable("id")  String id);
}
  • If he is using a naming server, that means he doesnt want to hardcode the domain. But you are right, this way works and not require load balancing – Guilherme Alencar Apr 16 '19 at 13:10
0

I think you should add the following anotation in your proxy:

@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 {
...
Guilherme Alencar
  • 1,243
  • 12
  • 21
0
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.
Mayur
  • 21
  • 3
0

Adding the below Maven dependency helped me to solve this issue-

<dependency>
    <groupId>io.github.openfeign.form</groupId>
       <artifactId>feign-form</artifactId>
    <version>3.4.1</version>
</dependency>
David Buck
  • 3,752
  • 35
  • 31
  • 35
Atul M
  • 1
  • 1