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.