it-roy-ru.com

"Для поля требуется компонент типа, который не может быть найден". ошибка пружины restful API с помощью mongodb

Так что я учил весну в парах недели, следуя этому уроку

Создание веб-службы RESTful

Все было хорошо, пока я не попытался интегрировать его в mongodb. Поэтому я следую этому уроку.

Доступ к данным с MongoDB

Но моя практика частично все еще использует первую. Так что структура моего каталога проекта выглядит следующим образом.

src/
├── main/
│   └── Java/
|       ├── model/
|       |   └── User.Java
|       ├── rest/
|       |   ├── Application.Java
|       |   ├── IndexController.Java
|       |   └── UsersController.Java
|       └── service/
|           └── UserService.Java
└── resources/
    └── application.properties

Это мой файл model/User.Java

package main.Java.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="user")
public class User {

    private int age;
    private String country; 
    @Id
    private String id;
    private String name;


    public User() {
        super();
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

Это мой файл rest/UsersController.Java

package main.Java.rest;

import Java.util.List;
import main.Java.service.UserService;
import main.Java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/users")
public class UsersController {

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public List<User> getAllUsers() {
        return userService.findAll();
    }
}

Это мой файл service/UserService.Java

package main.Java.service;

import Java.util.List;
import main.Java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserService extends MongoRepository<User, String> {
    public List<User> findAll();
}

Я мог бы скомпилировать их (я использую gradle для компиляции, потому что я следую учебному пособию), но когда я запускал файл jar, он выдавал эту ошибку.


Приложение не удалось запустить


Описание:

Для поля userService в main.Java.rest.UsersController требуется компонент введите 'main.Java.service.UserService', который не может быть найден.

Действие:

Попробуйте определить bean-компонент типа 'main.Java.service.UserService' в ваша конфигурация.

Не зная, что не так, я начал поискать в Интернете и обнаружил, что мне нужно включить файл Beans.xml и зарегистрировать в нем userService. Я сделал это, но это не работает. Я действительно новичок в этом, поэтому я действительно понятия не имею, что происходит.

47
Eka Rudianto

Решил это. Поэтому по умолчанию все пакеты, которые подпадают под объявление @SpringBootApplication, будут проверены.

Предполагая, что мой основной класс ExampleApplication, который имеет объявление @SpringBootApplication, объявлен внутри com.example.something, тогда все компоненты, которые подпадают под com.example.something, сканируются, а com.example.applicant не будет сканироваться.

Таким образом, есть два способа сделать это, основываясь на этом вопрос . использование

@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})

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

Поэтому я использую второй подход, реструктурируя свои пакеты, и это сработало! Теперь структура моих пакетов стала такой.

src/
├── main/
│   └── Java/
|       ├── com.example/
|       |   └── Application.Java
|       ├── com.example.model/
|       |   └── User.Java
|       ├── com.example.controller/
|       |   ├── IndexController.Java
|       |   └── UsersController.Java
|       └── com.example.service/
|           └── UserService.Java
└── resources/
    └── application.properties
74
Eka Rudianto

Добавьте @Service в сервис/UserService.Java.

43
dzzxjl

У меня тоже была такая же ошибка:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found.


Action:

Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here

И мои пакеты были сконструированы так же, как указано в принятом ответе. Я исправил свою проблему, добавив аннотацию EnableMongoRepositories в основной класс следующим образом:

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {

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

Я столкнулся с той же проблемой, и все, что мне нужно было сделать, это поместить Приложение в пакет на один уровень выше, чем пакеты service, dao и domain.

8
Akash Yellappa

Эта тема старая, но я публикую свой ответ, который может быть полезен для других.

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

3
Bhushan Karmarkar

Потратил много времени из-за автоматического импорта . Intellij Idea почему-то импортировал @Service из import org.jvnet.hk2.annotations.Service; вместо import org.springframework.stereotype.Service;!

3
Vitali Kuzmin

Обычно мы можем решить эту проблему в двух аспектах:

  1. правильная аннотация должна использоваться для Spring Boot сканирования bean, например @Component;
  2. путь scan будет включать в себя классы, как и все другие, упомянутые выше. 

Кстати, есть очень хорошее объяснение разницы между @Component, @Repository, @Service и @Controller .

2
Hearen

Добавьте @Component в свой класс контроллера. Пусть эта работа 

2
shubham bansal

Я пришел к этому сообщению в поисках помощи при использовании Spring Webflux с Mongo Repository.

Моя ошибка была похожа на владельца

Field usersRepository in foobar.UsersService required
a bean of type 'foobar.UsersRepository' that could not be found.

Поскольку раньше я работал с Spring MVC, я был удивлен этой ошибкой.

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

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

Вторым важным моментом является то, что если вы используете Webflux, вам нужно использовать другой пакет при использовании Spring MVC, например. для MongoDB нужно добавить

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

с -реактивным в конце.

0
Łukasz Kotyński

Использование всех аннотаций @ решило мою проблему. (Да, я новичок в Spring) Если вы используете сервисный класс, добавьте @Service, и то же самое для @Controller и @Repository.

Затем эта аннотация на App.Java исправила проблему (я использую JPA + Hibernate)

@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")

Пакетное дерево:

src/
├── main/
│   └── Java/
|       ├── es.unileon.inso2/
|       |   └── App.Java
|       ├── es.unileon.inso2.model/
|       |   └── User.Java
|       ├── es.unileon.inso2.controller/
|       |   ├── IndexController.Java
|       |   └── UserController.Java
|       ├── es.unileon.inso2.service/
|       |    └── UserService.Java
|       └── es.unileon.inso2.repository/
|            └── UserRepository.Java
└── resources/
    └── application.properties
0
Kashmir54

У меня та же проблема, исправленная Adding @EnableMongoRepositories ("in.topthree.util")

package in.topthree.core;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import in.topthree.util.Student;

@SpringBootApplication
@EnableMongoRepositories("in.topthree.util")
public class Run implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Run.class, args);
        System.out.println("Run");
    }

    @Autowired
    private Process pr;

    @Override
    public void run(String... args) throws Exception {
        pr.saveDB(new Student("Testing", "FB"));
        System.exit(0);
    }

}

И мой репозиторий

 package in.topthree.util;

    import org.springframework.data.mongodb.repository.MongoRepository;

    public interface StudentMongo extends MongoRepository<Student, Integer> {

        public Student findByUrl(String url);
    }

Сейчас работает

0
Ahmad

В моем случае я случайно определил класс обслуживания abstract при копировании и вставке.

@Serivce
@Valdiated
public abstract class MyService { // remove the abstract modifier!!!
}
0
Jin Kwon

Мои классы реализации Mapper в моей целевой папке были удалены, поэтому в моих интерфейсах Mapper больше не было классов реализации. Таким образом я получил ту же ошибку Field *** required a bean of type ***Mapper that could not be found.

Я просто должен был восстановить мои mappers-реализации с помощью maven и обновить проект ...

0
RotS

В моем случае я просто поместил класс MyprojectApplication в пакет (com.example.start) с тем же уровнем модели, контроллера, пакетов услуг.

0
Zain Elabidine