Spring Boot @autowired не работает, классы в разных пакетах

У меня есть приложение загрузки Spring.

Я получаю следующую ошибку

org.springframework.beans.factory.BeanCreationException: ошибка создавая bean с именем "birthdayController": инъекция автоспуска зависимости не удались; вложенное исключение org.springframework.beans.factory.BeanCreationException: не удалось autowire field: частный com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository; вложенными исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет квалификация bean типа [com.esri.birthdays.dao.BirthdayRepository] найденный для зависимости: ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости. Аннотации зависимостей: {@Org.springframework.beans.factory.annotation.Autowired(обязательно = истина)}       на org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:334) ~ [spring - beans -4.2.4.RELEASE.jar: 4.2.4.RELEASE]       на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~ [spring - beans -4.2.4.RELEASE.jar: 4.2.4.RELEASE]       на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~ [spring - beans -4.2.4.RELEASE.jar: 4.2.4.RELEASE]       на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~ [spring - beans -4.2.4.RELEASE.jar: 4.2.4.RELEASE]       at org.springframework.beans.factory.support.AbstractBeanFactory $1.getObject(AbstractBeanFactory.java:306) ~ [spring - beans -4.2.4.RELEASE.jar: 4.2.4.RELEASE]       при или

Ниже приведен код моего класса репозитория

package com.esri.birthdays.dao;
import com.esri.birthdays.model.BirthDay;
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
    public BirthDay findByFirstName(String firstName);
}

Ниже приведен контроллер.

package com.esri.birthdays.controller;
@RestController
public class BirthdayController {

    @Autowired
    private BirthdayRepository repository;

Работает, если они находятся в одном пакете. Не знаю, почему

Ответ 1

Когда вы используете аннотацию @SpringBootApplication, например, в пакете

com.company.config

он автоматически выполнит сканирование компонентов следующим образом:

@ComponentScan("com.company.config") 

Поэтому он НЕ будет проверять пакеты, такие как com.company.controller и т.д. Вот почему вы должны объявить свою @SpringBootApplication в пакете на один уровень до ваших обычных пакетов следующим образом: com.company ИЛИ использовать свойство scanBasePackages, например:

@SpringBootApplication(scanBasePackages = { "com.company" })

ИЛИ componentScan:

@SpringBootApplication
@ComponentScan("com.company")


Ответ 2

Просто поместите пакеты в тег @SpringBootApplication.

@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})

Сообщите мне.

Ответ 3

Попробуйте аннотировать свой класс конфигурации с помощью аннотации @ComponentScan("com.esri.birthdays"). Обычно говорят: если у вас есть субпакеты в вашем проекте, вам нужно отсканировать свои соответствующие классы в корне проекта. Думаю, для вашего случая это будет "com.esri.birthdays". Вам не понадобится ComponentScan, если у вас нет субпакетов в вашем проекте.

Ответ 4

Spring Boot будет обрабатывать эти репозитории автоматически, если они включены в один и тот же пакет (или подпакет) вашего класса @SpringBootApplication. Для большего контроля над процессом регистрации вы можете использовать аннотацию @EnableMongoRepositories. spring.io guide

@SpringBootApplication
@EnableMongoRepositories(basePackages = {"RepositoryPackage"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Ответ 5

Для этой проблемы я закончил создание аннотации @Service для вновь созданного класса сервиса, после чего был выбран автоузел. Итак, попробуйте проверить те классы, которые не получают автообновление, если им нужны соответствующие требуемые аннотации (например, @Controller, @Service и т.д.), Которые применяются к ним, а затем попытайтесь снова создать проект.

Ответ 6

В моем случае @component не работал, потому что я инициализировал этот экземпляр класса с помощью new <classname>().

Если мы инициализируем экземпляр обычным способом Java в любом месте кода, то spring не будет добавлять этот компонент в контейнер IOC.

Ответ 7

Попробуйте следующее:

    @Repository
    @Qualifier("birthdayRepository")
    public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
        public BirthDay findByFirstName(String firstName);
    }

И при вводе bean:

    @Autowired
    @Qualifier("birthdayRepository")
    private BirthdayRepository repository;

Если нет, проверьте свой CoponentScan в своей конфигурации.

Ответ 8

Там обязательно будет бин, также содержащий поля, связанные с днем рождения Так что используйте это, и ваша проблема будет решена

@SpringBootApplication
@EntityScan("com.java.model*")  // base package where bean is present
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Ответ 9

У меня такая же проблема. Это сработало для меня, когда я удалил приватный модификатор из объектов Autowired.

Ответ 10

По умолчанию в загрузочных приложениях Spring сканирование компонентов выполняется внутри пакета, в котором находится ваш основной класс. любой bean-компонент, находящийся за пределами пакета, не будет создан и, следовательно, дает вышеупомянутое исключение.

Решение: вы можете либо переместить bean-компоненты в основной весенний загрузочный класс (что не очень хорошо), либо создать отдельный файл конфигурации и импортировать его:

@Import({CustomConfigutation1.class, CustomConfiguration2.class})
@SpringBootpplication
public class BirthdayApplication {

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

}

Добавьте компоненты в эти файлы CustomConfiguration.