Параметр 0 конструктора требует bean-компонента, который не может быть найден - PullRequest
0 голосов
/ 20 февраля 2019

Я не уверен, что не так с моими кодами.Я пытался изучить Spring Boot WebFlux.Но я не могу запустить приложение, поскольку я получаю следующую ошибку

"Параметру 0 конструктора в com.thomsoncodes.todo.controller.ToDoController требуется компонент типа 'com.thomsoncodes.todo.repository.ToDoRespository ', который не может быть найден. "

Усталый @Autowired, но все еще у меня та же ошибка.

Вот мой код

build.gradle

plugins {
  id 'org.springframework.boot' version '2.1.3.RELEASE'
  id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.thomsoncodes.todo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
  mavenCentral()
}

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-webflux'
   compileOnly 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   testImplementation 'io.projectreactor:reactor-test'
}

Класс приложения

package com.thomsoncodes.todo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootTodoWebfluxApplication {

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

}

Класс контроллера

package com.thomsoncodes.todo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.thomsoncodes.todo.domain.ToDo;
import com.thomsoncodes.todo.repository.ToDoRespository;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
public class ToDoController {

   private ToDoRespository repository;

   public ToDoController(ToDoRespository repository) {
    this.repository = repository;
   }

   @GetMapping("/rodo/{id}")
   public Mono<ToDo> getTodo(@PathVariable String id) {
      return this.repository.findById(id);
   }

   @GetMapping("/todo")
   public Flux<ToDo> getToDos() {
      return this.repository.findAll();
   }
}

Класс домена

 package com.thomsoncodes.todo.domain;

 import java.time.LocalDateTime;
 import java.util.UUID;

 import lombok.Data;

 @Data
 public class ToDo {
 private String id;
 private String description;
 private LocalDateTime created;
 private LocalDateTime modified;
 private boolean completed;

 public ToDo() {
    this.id = UUID.randomUUID().toString();
    this.created = LocalDateTime.now();
    this.modified = LocalDateTime.now();
 }

 public ToDo(String description) {
    this();
    this.description = description;     
 }

 public ToDo(String description, boolean completed) {
    this();
    this.description = description;
    this.completed = completed;
  }
}

Класс репозитория

package com.thomsoncodes.todo.repository;

import java.util.Arrays; 
import com.thomsoncodes.todo.domain.ToDo;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class ToDoRespository {

private Flux<ToDo> toDoFlux = Flux.fromIterable(Arrays.asList(
        new ToDo("Do Homework"),
        new ToDo("Workout in the morning", true),
        new ToDo("Make dinner tonight"),
        new ToDo("Clean the studio", true),
        new ToDo("Learn spring boot", true)));

  public Mono<ToDo> findById(String id) {
    return Mono.from(
            toDoFlux.filter( todo -> todo.getId().equals(id)));
  }

  public Flux<ToDo> findAll() {
     return toDoFlux;
  }


}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вам необходимо внести пару изменений,

  1. Аннотировать ToDoRepository с @Repository или @Component
  2. Аннотировать ToDoRepository с @Autowired в классе контроллера(необязательно)
0 голосов
/ 20 февраля 2019

ToDoRepository не помечен как @ Component.

...