Подтвердить что ты не робот

Рассмотрим определение bean типа 'package' в вашей конфигурации [Spring -Boot]

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

***************************
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.

--------------------- UPDATE 2 ------------------------ ------

Я добавил базовый пакет bean, на который он жаловался. Ошибка:

***************************
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 my repo TApplicantRepository в него.

4b9b3361

Ответ 1

Это может быть потому, что проект был разбит на разные модули.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {

Ответ 2

Класс вашего кандидата не сканируется. По умолчанию будут сканироваться все пакеты, начиная с корня в качестве класса, в который вы положили @SpringBootApplication.

предположим, что ваш класс main "WebServiceApplication" находится в "com.service.something", тогда все компоненты, которые попадают под "com.service.something", сканируются, а "com.service.applicant" не будет сканироваться.

Вы можете либо перестроить свои пакеты таким образом, чтобы "WebServiceApplication" попадает под корневой пакет, а все остальные компоненты становятся частью этого корневого пакета. Или вы можете включить @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"}) и т.д., Чтобы компоненты "ALL" проверялись и инициализировались в контейнере spring.

Обновление на основе комментария

Если у вас есть несколько модулей, которыми управляет maven/ gradle, все запросы spring - это пакет для сканирования. Вы скажете spring сканировать "com.module1", и у вас есть еще один модуль с именем корневого пакета как "com.module2", эти компоненты не будут сканироваться. Вы даже можете сказать spring сканировать "com" ​​, который затем сканирует все компоненты в "com.module1." и "com.module2."

Ответ 3

Есть шанс...
Возможно, вам не хватает аннотации @Service, @Repository в ваших соответствующих классах реализации.

Ответ 4

В основном это происходит, когда у вас есть приложение класса в "другом пакете". Например:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Я решаю проблему с этим в Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Еще один менее элегантный способ: поместить все классы конфигурации в один и тот же пакет.

Ответ 5

В моем случае у меня была ужасная ошибка. Я поставил @Service до интерфейса сервиса.

Чтобы исправить это, я поставил @Service для реализации служебного файла, и он работал для меня.

Ответ 6

Я думаю, вы можете упростить, аннотировав свой репозиторий с помощью @Repository, тогда он будет автоматически активирован Spring Framework.

Ответ 7

Это также может произойти, если вы используете Lombok и добавляете @RequiredArgsConstructor и @NonNull для полей, но некоторые из ваших полей не должны вводиться в конструктор. Это только одна из возможностей получить ту же ошибку.

параметр 0 требовал bean-компонента типа MissingBeanName, который не может быть найден

В моем случае ошибка сказала мне, в каком контроллере была проблема, после удаления @NonNull приложение запустилось нормально

Ответ 8

Если bean-компонент находится в том же пакете, в котором он находится в @Autowired, он никогда не вызовет такой проблемы. Однако бины не доступны из разных пакетов по умолчанию. Чтобы устранить эту проблему, выполните следующие действия:

  1. Импортируйте следующее в ваш основной класс:
    import org.springframework.context.annotation.ComponentScan;
  2. добавьте аннотацию к вашему основному классу:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

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

Ответ 9

Я искал в Интернете ответ, но, похоже, нет единственного правильного решения для моего случая: в самом начале все работает хорошо следующим образом:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Затем я пытаюсь добавить карту для кэширования чего-либо, и это становится так:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Boom!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Я удалил @AllArgsConstructor(onConstructor = @__(@Autowired)) и добавил @Autowired для каждого repository и service кроме Map<String, String>. Это просто работает, как и раньше.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Надеюсь, это может быть полезно.

Ответ 10

В моем случае эти два варианта работали.

  1. в //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) также пакет, содержащий Application.class в списке, или

  2. Просто добавьте @EnableAutoConfiguration; он автоматически распознает все весенние бобы.

Ответ 11

@SpringBootApplication
@MapperScan("com.developer.project.mapper")

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

Ответ 12

Это может произойти, если класс @Service помечен как абстрактный.

Ответ 13

Это сработало для меня после добавления ниже аннотации в приложении:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

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

msgstr "для параметра 1 конструктора требуется компонент bean типа mapper, который не найден:

Ответ 14

В моем случае эта ошибка появляется из-за того, что мой импорт был неправильным, например, с использованием Spring, импорт автоматически появляется:

import org.jvnet.hk2.annotations.Service;

но мне нужно было:

import org.springframework.stereotype.Service;

Ответ 15

У меня был случай, когда мне нужно внедрить RestTemplate в класс обслуживания. Однако RestTemplate не может быть выбран классом обслуживания. Я создал класс оболочки в том же пакете, что и основное приложение, и пометил оболочку как Компонент и автоматически связал этот компонент в классе обслуживания. Задача решена. надеюсь, что это также работает для вас

Ответ 16

Если ваша классовая зависимость управляется Spring, то эта проблема может возникнуть, если мы забыли добавить конструктор arg по умолчанию/пустой внутри нашего класса POJO.

Ответ 17

В моем случае было недостаточно иметь bean с типом coorect (как предлагалось в сообщении), но я должен был на самом деле назвать метод @Bean подобно параметру, то есть

@Bean
Foo foo(...){...}

Затем я смог ввести его в конструктор моего класса с помощью

MyClass(Foo foo){...}