web-dev-qa-db-fra.com

'Field avait besoin d'un haricot d'un type introuvable.' printemps d'erreur api reposant utilisant mongodb

Donc, j'ai appris le printemps dans les couples de la semaine, j'ai suivi ce tutoriel

Création d'un service Web RESTful

Tout allait bien jusqu'à ce que j'essaye de l'intégrer à Mongodb. Alors je suis ce tutoriel.

Accès aux données avec MongoDB

Mais ma pratique utilise encore partiellement le premier. Donc, ma structure de répertoire de projet est comme ça.

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

Ceci est mon fichier 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;
    }
}

Ceci est mon fichier 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();
    }
}

Ceci est mon fichier 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();
}

Je pourrais les compiler (j'utilise gradle pour la compilation parce que je suis le tutoriel), mais lorsque je lance le fichier jar, cette erreur est générée.


APPLICATION ÉCHOUÉE AU DÉMARRAGE


La description:

Le champ userService dans main.Java.rest.UsersController nécessitait un bean de tapez 'main.Java.service.UserService' introuvable.

Action:

Pensez à définir un bean de type 'main.Java.service.UserService' dans votre configuration.

Ne sachant pas ce qui ne va pas, je commence à chercher sur Google et découvre que je dois inclure le fichier Beans.xml et y inscrire le service utilisateur. J'ai fait ça mais ça ne marche pas. Je suis vraiment nouveau dans ce domaine, je n'ai donc aucune idée de ce qui se passe.

47
Eka Rudianto

Résolu. Donc, par défaut, tous les paquets qui relèvent de la déclaration @SpringBootApplication seront analysés.

En supposant que ma classe principale ExampleApplication ayant la déclaration @SpringBootApplication soit déclarée dans com.example.something, tous les composants relevant de com.example.something sont analysés, alors que com.example.applicant ne le sera pas.

Donc, il y a deux façons de le faire en fonction de cette question . Utilisation

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

De cette façon, l'application analysera tous les composants spécifiés, mais je pense que si l'échelle devenait plus grande? 

J'utilise donc la deuxième approche, en restructurant mes paquets et cela a fonctionné! Maintenant, la structure de mes paquets est devenue comme ça.

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

Ajoutez le @Service dans le service/UserService.Java.

43
dzzxjl

J'ai aussi eu la même erreur:

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

Et mes colis ont été construits de la même manière que celle mentionnée dans la réponse acceptée. J'ai résolu mon problème en ajoutant l'annotation EnableMongoRepositories dans la classe principale comme ceci:

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

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

J'ai rencontré le même problème et tout ce que j'avais à faire était de placer l'application dans un package d'un niveau supérieur à celui des packages service, dao et domain.

8
Akash Yellappa

Ce fil est ancien maintenant, mais je poste ma réponse, ce qui peut être utile pour d'autres.

J'ai eu le même problème ... Il s'est avéré qu'il existe une autre classe avec le même nom dans un autre module. J'ai renommé cette classe et cela a résolu le problème.

3

A passé beaucoup de temps à cause de l'importation automatique . Intellij Idea somewhy a importé @Service de import org.jvnet.hk2.annotations.Service; au lieu de import org.springframework.stereotype.Service;!

3
Vitali Kuzmin

Normalement, nous pouvons résoudre ce problème sous deux aspects:

  1. les annotations appropriées doivent être utilisées pour Spring Boot numériser le bean, comme @Component;
  2. le chemin scanning inclura les classes comme toutes les autres mentionnées ci-dessus. 

À propos, il existe une très bonne explication de la différence entre @Component, @Repository, @Service et @Controller .

2
Hearen

Ajoutez le @Component dans votre classe de contrôleur. Que ce travail 

2
shubham bansal

Je suis venu à ce poste à la recherche d'aide pour utiliser Spring Webflux avec Mongo Repository.

Mon erreur était semblable au propriétaire

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

Comme je travaillais auparavant avec Spring MVC, cette erreur m'a surpris.

Parce que trouver de l'aide n'était pas si évident, je réponds à cette question car elle est en quelque sorte liée et que cette question a beaucoup de résultats de recherche.

La première chose à faire est de vous rappeler ce qui a été mentionné dans la réponse marquée comme étant acceptée - la hiérarchie des paquets.

Deuxièmement, si vous utilisez Webflux, vous devez utiliser un package différent lorsque vous utilisez Spring MVC, par exemple. pour MongoDB vous devez ajouter

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

avec -réactif à la fin.

0
Łukasz Kotyński

Utiliser toutes @ Annotations a résolu mon problème. (Oui, je suis nouveau dans Spring) Si vous utilisez une classe de service, ajoutez @Service, de même pour @Controller et @Repository.

Ensuite, ces annotations sur l'App.Java ont corrigé le problème (j'utilise JPA + Hibernate)

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

Arbre de package:

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

J'ai le même problème, résolu par Add @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);
    }

}

Et mon dépôt

 package in.topthree.util;

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

    public interface StudentMongo extends MongoRepository<Student, Integer> {

        public Student findByUrl(String url);
    }

Maintenant son travail

0
Ahmad

Dans mon cas, j’ai accidentellement défini la classe de service abstract en faisant un copier-coller.

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

Vous devez ajouter l'annotation @Service à l'implémentation de votre service.

0
Ahmed AMMOURI

Mes classes d'implémentation Mapper dans mon dossier cible avaient été supprimées, donc mes interfaces Mapper n'avaient plus de classes d'implémentation. J'ai donc la même erreur Field *** required a bean of type ***Mapper that could not be found.

Je devais simplement régénérer mes mises en œuvre de mappeurs avec maven et actualiser le projet ...

0
RotS

Dans mon cas, je viens de placer Class MyprojectApplication dans un package (com.example.start) avec le même niveau de modèle, de contrôleur et de packages de service.

0
Zain Elabidine