Reputation: 218
APPLICATION FAILED TO START
Description:
Parameter 0 of constructor in edu.rohit.circuitbreakclient.controller.CircuitBreakerController required a bean of type 'edu.rohit.circuitbreakclient.service.CircuitBreakerService$BookService' that could not be found.
Action:
Consider defining a bean of type 'edu.rohit.circuitbreakclient.service.CircuitBreakerService$BookService' in your configuration.
CircuitBreakerService
is as below.
@Service
@Component
@SpringBootApplication(scanBasePackages={"edu.rohit.circuitbreakclient.service", "edu.rohit.circuitbreakclient.controller"})
//CircuitBreakerClientApplication
package edu.rohit.circuitbreakclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
@EnableCircuitBreaker
@SpringBootApplication(scanBasePackages= {"edu.rohit.circuitbreakclient.service", "edu.rohit.circuitbreakclient.controller"})
public class CircuitBreakerClientApplication {
public static void main(String[] args) {
SpringApplication.run(CircuitBreakerClientApplication.class, args);
}
}
//CircuitBreakerController
package edu.rohit.circuitbreakclient.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import edu.rohit.circuitbreakclient.service.CircuitBreakerService.BookService;
@RestController
@CrossOrigin
@RequestMapping("/read")
public class CircuitBreakerController {
BookService bookService;
@Autowired
CircuitBreakerController(BookService bs){
this.bookService=bs;
}
@RequestMapping("/get")
public String toRead() {
return bookService.readingList();
}
}
//BookingService
package edu.rohit.circuitbreakclient.service;
import java.net.URI;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
public class CircuitBreakerService {
//@Service
@Component
public class BookService {
private final RestTemplate restTemplate;
public BookService(RestTemplate rest) {
this.restTemplate = rest;
}
@HystrixCommand(fallbackMethod = "reliable")
public String readingList() {
URI uri = URI.create("http://localhost:8060/recommended");
return this.restTemplate.getForObject(uri, String.class);
}
public String reliable() {
return "Cloud not navigate to Circuit Breaker Server";
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>edu.rohit</groupId>
<version>1</version>
<description>Demo project for Spring Boot CircuitBreakerClient</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2.1.3.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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> -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<artifactId>CircuitBreakerClient</artifactId>
<name>CircuitBreakerClient</name>
</project>
application.properties
server.port=8061
hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=500
Upvotes: 0
Views: 5542
Reputation: 18235
BookService
is a nested class, its instance is associated with one CircuitBreakerService
but no instance of CircuitBreakerService
is configured so Spring can't figure out how to initialize the inner class.
So either
BookService
into a standalone class or BookService
with public static
or CircuitBreakerService {
@Component
public static class BookService {}
}
CircuitBreakerService
with @Component
@Component
CircuitBreakerService {
@Component
public class BookService {}
}
Upvotes: 1