Я получаю следующую ошибку:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.
Action:
Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.
Я никогда раньше не видел этой ошибки, но странно, что @Autowire не работает. Вот структура проекта:
Интерфейс кандидата
public interface Applicant {
TApplicant findBySSN(String ssn) throws ServletException;
void deleteByssn(String ssn) throws ServletException;
void createApplicant(TApplicant tApplicant) throws ServletException;
void updateApplicant(TApplicant tApplicant) throws ServletException;
List<TApplicant> getAllApplicants() throws ServletException;
}
ApplicantImpl
@Service
@Transactional
public class ApplicantImpl implements Applicant {
private static Log log = LogFactory.getLog(ApplicantImpl.class);
private TApplicantRepository applicantRepo;
@Override
public List<TApplicant> getAllApplicants() throws ServletException {
List<TApplicant> applicantList = applicantRepo.findAll();
return applicantList;
}
}
Теперь я должен иметь возможность просто использовать Autowire Applicant и иметь доступ, однако в этом случае он не работает, когда я вызываю его в своем @RestController:
@RestController
public class RequestController extends LoggingAware {
private Applicant applicant;
@Autowired
public void setApplicant(Applicant applicant){
this.applicant = applicant;
}
@RequestMapping(value="/", method = RequestMethod.GET)
public String helloWorld() {
try {
List<TApplicant> applicantList = applicant.getAllApplicants();
for (TApplicant tApplicant : applicantList){
System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
}
return "home";
}
catch (ServletException e) {
e.printStackTrace();
}
return "error";
}
}
------------------------ ОБНОВЛЕНИЕ 1 -----------------------
я добавил
@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
и ошибка исчезла, но ничего не произошло. Однако , когда я закомментировать всё дело с Applicant
в RestController
перед добавлением @ComponentScan()
я смог вернуть строку в UI
, таким образом , это означает , что я RestController
работал, теперь он пропуск. Теперь я некрасивая Whitelabel Error Page
.
--------------------- ОБНОВЛЕНИЕ 2 --------------------------- ---
Я добавил базовый пакет компонента, на который он жаловался. Ошибка гласит:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.
Action:
Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.
я добавил @ComponentScan
@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
---------------------------- Обновление 3 -------------------- -
добавление:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
все еще жалуется на мой ApplicantImpl
класс, в котором @Autowires
мое репо TApplicantRepository
.
источник
Ответы:
Возможно, это связано с тем, что проект разбит на разные модули.
источник
@EntityScan
и@EnableJpaRepositories
с правильными именами пакетов работал у меня.Существует шанс ...
Вы , возможно, отсутствуете
@Service
,@Repository
аннотация на ваши соответствующих классах реализации.источник
Похоже, ваш класс кандидата не просматривается. По умолчанию
@SpringBootApplication
будут просканированы все пакеты, начинающиеся с корневого в качестве класса, в который вы поместили .предположим, что ваш
main
класс «WebServiceApplication» находится в «com.service.something
», тогда все компоненты, подпадающие под «com.service.something
», сканируются, а «com.service.applicant
» сканироваться не будет.Вы можете реструктурировать свои пакеты так, чтобы «WebServiceApplication» подпадал под корневой пакет, а все остальные компоненты становились частью этого корневого пакета. Или вы можете включить и
@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
т. Д., Чтобы «ВСЕ» компоненты сканировались и инициализировались в контейнере spring.Обновление на основе комментария
Если у вас есть несколько модулей, которыми управляет maven / gradle, все, что нужно Spring, - это пакет для сканирования. Вы говорите Spring просканировать com.module1, и у вас есть другой модуль, имя корневого пакета которого - com.module2, эти компоненты не будут сканироваться. Вы даже можете указать Spring сканировать "com", который затем просканирует все компоненты в "
com.module1.
" и "com.module2.
"источник
build.gradle
. Этиbuild.gradle
имена модулей добавляются кdependencies
модулю с помощью метода main. Поэтому, когда вы увидели@ComponentScan("module-service")
, я подумал, что это сработает. Однако внутриmodule-service
есть одна упаковка. Итак, мой вопрос, как это будет выглядеть? Я просто назову имя пакета или имя модуля или как-то и то, и другое?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@SpringBootApplication(scanBasePackages= "com")
это сделал, и он жалуется на репозиторий JPA. Большое спасибо. Я не знал, что spring просканирует все пакеты, начинающиеся с "com", если вы сделаете это.Обычно это происходит, когда ваше приложение класса находится в «другом пакете». Например:
Решаю проблему с этим в Application.class
Другой менее элегантный способ - поместить все классы конфигурации в один пакет.
источник
@ComponentScan
в приведенном выше сценарии. Поскольку вашApplication.class
(который имеет@SpringBootApplication
аннотацию) помещен вcom.server
который в любом случае является корнем для обоих,com.server.config
а такжеcom.server.repository
.@EnableMongoRepositories
?В моем случае у меня была ужасная ошибка. Ставлю
@Service
на сервисный интерфейс.Чтобы исправить это, я поставил
@Service
реализацию служебного файла и у меня это сработало.источник
Если bean-компонент находится в том же пакете, что и @Autowired, он никогда не вызовет такой проблемы. Однако по умолчанию bean-компоненты недоступны из разных пакетов. Чтобы решить эту проблему, выполните следующие действия:
import org.springframework.context.annotation.ComponentScan;
источник
Я думаю, вы можете упростить его, аннотировав свой репозиторий с помощью @Repository, тогда он будет автоматически включен Spring Framework.
источник
В моем случае эти два варианта сработали.
in также
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
включает пакет, содержащий в списке, илиApplication.class
Просто добавьте
@EnableAutoConfiguration
; он автоматически распознает все весенние бобы.источник
Это также может произойти, если вы используете Lombok и добавляете поля
@RequiredArgsConstructor
и@NonNull
for, но некоторые из ваших полей не должны вводиться в конструктор. Это только одна из возможностей получить ту же ошибку.В моем случае ошибка сообщила мне, в каком контроллере возникла проблема, после удаления
@NonNull
приложение запустилось нормальноисточник
@AllArgsConstructor
удаления аннотации и разрешения java создать пустой конструктор, позволяя Spring правильно создавать экземпляр объекта и вводить зависимости.Я столкнулся со знакомой проблемой в моем многомодульном проекте Maven с Spring Boot 2. Проблема была связана с именованием моих пакетов в подчиненных модулях Maven.
@SpringBootApplication инкапсулирует множество компонентов, таких как @ComponentScan, @EnableAutoConfiguration, jpa-репозитории, json-сериализация и так далее. И он помещает @ComponentScan в пакет com. *******. Space. Эта часть com. *******. Пространства пакетов должна быть общим для всех модулей.
Чтобы исправить это:
источник
Я искал ответ в Интернете, но, похоже, в моем случае нет единственного правильного решения: в самом начале все работает хорошо следующим образом:
Затем я пытаюсь добавить карту, чтобы что-то кешировать, и она становится такой:
Бум!
Я удалил
@AllArgsConstructor(onConstructor = @__(@Autowired))
и добавил@Autowired
для каждогоrepository
иservice
кромеMap<String, String>
. Все работает как раньше.Надеюсь, это может быть полезно.
источник
Это сработало для меня после добавления аннотации ниже в приложение:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Я получал следующую ошибку:
источник
Аннотация @Configuration просто решит ошибку
источник
Вы также получите эту ошибку, если случайно определите один и тот же компонент в двух разных классах. Это случилось со мной. Сообщение об ошибке вводило в заблуждение. Когда я удалил лишний компонент, проблема была решена.
источник
источник
Это может произойти, если класс @Service помечен как абстрактный.
источник
Если зависимость вашего класса управляется Spring, эта проблема может возникнуть, если мы забыли добавить конструктор по умолчанию / пустой arg внутри нашего класса POJO.
источник
Это может кому-нибудь помочь. У меня была такая же проблема, такое же сообщение об ошибке, все то же самое. Я пробовал решения из других ответов, не помогло, пока не понял, что бин, который я использую, имеет то же имя, что и тот, который на самом деле был автоматически подключен. Произошло это в разгар рефакторинга, поэтому пришлось переименовать класс, что положительно. Ура
источник
Я столкнулся с той же проблемой. Репозиторий Mongo DB был идентифицирован при загрузке Spring, но он не создавал Bean для интерфейса репозитория, расширяющего репозиторий mongo.
В моем случае проблема заключалась в неправильной спецификации версии в maven pom для "spring + mango". Я изменил идентификатор группы артефакта, и все заработало как по волшебству. никаких аннотаций не требуется, так как Spring boot позаботился обо всем.
Во время решения проблемы я искал решения по всей сети и понял, что эта проблема на самом деле связана с конфигурацией проекта, любой, кто сталкивается с этой проблемой, должен сначала проверить настройку своего проекта и включить отладку с весны, чтобы получить более подробную информацию о сбое и обратить пристальное внимание на где именно в процессе создание не удалось.
источник
В моем случае эта ошибка возникает из-за того, что мой импорт был неправильным, например, при использовании spring импорт автоматически появляется:
но мне нужно было:
источник
У меня был случай, когда мне нужно было ввести RestTemplate в класс обслуживания. Однако RestTemplate не может быть получен классом обслуживания. Я создал класс-оболочку в том же пакете, что и основное приложение, и пометил оболочку как Component и автоматически подключил этот компонент к классу обслуживания. Задача решена. надеюсь, это также сработает для вас
источник
Моя ошибка заключалась в том, что я включил:
вместо того:
источник
Я думаю, вам не хватает аннотации @Bean в вашем RequestController
Добавьте Bean в свой файл, это решило мою проблему.
Я получил это решение, когда изучал Spring Boot из учебной точки.
источник
Добавление зависимости Spring Boot Data JPA Starter решило проблему для меня.
Maven
Gradle
Или вы можете пойти прямо сюда
источник
Если вы используете
interface
вы можете распространяетсяCrudRepository<Applicant,Long>
с@Repository
аннотациями.источник
Проблема также может появиться, когда вы используете пример,
@EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)
а затем переименовали имя пакета или переместили его в другое место.Очень часто сталкивался с этим в рамках многомодульного проекта maven и весенней загрузки
источник
Существует вероятность того, что вы пытаетесь @autowired с интерфейсом , прежде чем реализовать интерфейс.
пример решения:
источник
Удалите конфигурацию типа аннотации, такую как @Service, из метода запуска потока.
источник
Попробуйте настроить структуру проекта, как показано ниже:
Поместите все репо, сервисы, пакеты в дочерний пакет основного пакета:
источник
Напоминаем, что Spring не сканирует мир, он использует целевое сканирование, то есть все в пакете, где хранится приложение springboot. поэтому эта ошибка «Рассмотрите возможность определения bean-компонента типа 'package' в вашей конфигурации [Spring-Boot]» может появиться из-за того, что у вас есть интерфейсы служб в другом пакете springbootapplication.
источник