SpringBoot: Неудовлетворенная зависимость NoSuchBeanDefinitionException, ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматического подключения - PullRequest
0 голосов
/ 10 мая 2019

Я делаю очень глупую ошибку, но не могу понять, как исправить.

У меня есть простое приложение SpringBoot, использующее профили, которые подключаются к MongoDb.

Мои pom.xml зависимости:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

My StudentController.java

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping(method = RequestMethod.GET)
    public Collection<Student> getAllStudents(){
        return studentService.getAllStudents();
    }
}

Мой StudentService.java

@Service
public class StudentService {

    @Autowired
    private StudentDao studentDao;

    public Collection<Student> getAllStudents(){
        return this.studentDao.getAllStudents();
    }
}

Мой StudentDao.java Интерфейс:

public interface StudentDao {
    Collection<Student> getAllStudents();
}

My MongoStudentDaoImpl.java :

@Repository
@Profile("test")
public class MongoStudentDaoImpl implements StudentDao {

    @Autowired
    private MongoStudentRepo repo;

    @Override
    public Collection<Student> getAllStudents() {
        return repo.findAll();
    }
}

My MongoStudentRepo.java :

@Profile("test")
public interface MongoStudentRepo extends MongoRepository<Student, String> {
}

Когда я пытаюсь запустить приложение, используя профиль «test», я вижу ошибку:

Исключительная ситуация при инициализации контекста - отмена попытка обновления: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем studentController: неудовлетворен зависимость выражается через поле 'studentService'; вложенное исключение isg.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем studentService: неудовлетворенная зависимость выражается через поле 'studentDao'; вложенное исключение org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем mongoStudentDaoImpl: неудовлетворен зависимость выражается через поле «репо»; вложенное исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступен квалифицирующий компонент типа «MongoStudentRepo»: ожидается, по крайней мере, 1 боб, который считается кандидатом autowire. Аннотации зависимостей: {@ Org.springframework.beans.factory.annotation.Autowired (обязательно = истина)}

Что мне здесь не хватает? Нужно ли добавлять аннотацию к MongoStudentRepo.java?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 10 мая 2019

Ваш класс интерфейса не нуждается в аннотации, так как интерфейсы репозитория Spring Data обрабатываются Spring Data специально.

Наиболее вероятным случаем является то, что ваш класс хранилища не идентифицируется Spring Data (вы не указали версию Spring Boot или имена пакетов), и в этом случае вам может потребоваться @EnableMongoRepositories в классе @Configuration (ваш класс запуска Spring Boot также один из них).

0 голосов
/ 10 мая 2019

Трассировка стека показывает, что Spring не может автоматически подключить один из компонентов MongoStudentRepo в вашем MongoStudentDaoImpl.java классе. Из трассировки стека:

 Unsatisfied dependency expressed through field 'repo'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'MongoStudentRepo' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: 

Spring вызывает это исключениеозначает, что bean-компонент MongoStudentRepo.class не создается должным образом.

Возможное решение:

  • Возможно, проблема в том, что Spring не создает bean-компонент для вашего интерфейса с использованием реализации по умолчаниювесной. Это может быть связано с тем, что вы не используете аннотацию @EnableJpaRepositories для включения сканирования и создания bean-компонента хранилища по умолчанию. Для получения дополнительной информации прочитайте здесь .

Но если выиспользуется конфигурация на основе xml. Для конфигурации на основе xml используйте:

<repositories base-package="com.acme.repository" />

<repositories base-package="com.acme.repository" repository-impl-postfix="MyPostfix" />

Или используйте аннотацию @Configuration:

@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {

  @Bean
  EntityManagerFactory entityManagerFactory() {
    // …
  }
}

Эту конфигурацию можно загрузить только для своего «тестового» профиля, есливы используете реализацию по умолчанию для пружины.

Лучшее чтение: https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.custom-implementations

0 голосов
/ 10 мая 2019

Мои извинения, я пропустил критерии исключения, которые я добавил в класс Main.java, чтобы заставить работать другой профиль.@Chrylis, спасибо за указатель.

Проблемный Main.java file

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class})
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

Исправлено Main.java file

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class})
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}
0 голосов
/ 10 мая 2019

Я думаю, что для Spring Data MongoDB добавление аннотации @EnableMongoRepositories к классу @Configuration - это все, что вам нужно.Просто убедитесь, что он находится в том же пакете, что и ваше основное приложение, или настройте компонентное сканирование, чтобы забрать его.

...