195 votes

Erreur "Field required a bean of type that could not be found" (Champ nécessitant un haricot de type qui ne peut être trouvé).

J'ai donc appris à connaître le printemps dans les couples de la semaine, en suivant ce tutoriel.

Création d'un service Web RESTful

Tout allait bien jusqu'à ce que j'essaie de l'intégrer à mongodb. J'ai donc suivi ce tutoriel.

Accéder aux données avec MongoDB

Mais dans ma pratique, j'utilise encore partiellement la première. La structure du répertoire de mon projet est donc la suivante.

src/
 main/
    java/
|        model/
|       |    User.java
|        rest/
|       |    Application.java
|       |    IndexController.java
|       |    UsersController.java
|        service/
|            UserService.java
 resources/
     application.properties

C'est mon modèle/Utilisateur.java fichier

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;
    }
}

C'est mon rest/UsersController.java fichier

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();
    }
}

C'est mon service/UserService.java fichier

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();
}

J'ai pu les compiler (j'utilise gradle pour la compilation car je suis le tutoriel), mais lorsque j'exécute le fichier jar, j'obtiens cette erreur.


L'APPLICATION N'A PAS RÉUSSI À DÉMARRER


Description :

Le champ userService de main.java.rest.UsersController requiert un bean de type 'main.java.service.UserService' qui n'a pas été trouvé. type 'main.java.service.UserService' qui n'a pas pu être trouvé.

Action :

Considérez la définition d'un bean de type 'main.java.service.UserService' dans le fichier votre configuration.

Ne sachant pas ce qui ne va pas, j'ai commencé à chercher sur Google et j'ai trouvé que je devais inclure Beans.xml et y enregistrer le userService. J'ai fait cela mais cela ne fonctionne pas. Je suis vraiment nouveau dans ce domaine et je n'ai aucune idée de ce qui se passe.

231voto

Eka Rudianto Points 1248

Résolu. Donc par défaut, tous les paquets qui tombent sous @SpringBootApplication La déclaration sera scannée.

En supposant que ma classe principale ExampleApplication qui a @SpringBootApplication est déclarée à l'intérieur de com.example.something alors tous les composants qui tombent sous com.example.something est scanné pendant que com.example.applicant ne seront pas scannés.

Donc, il y a deux façons de le faire en se basant sur ceci question . Utilisez

@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'ai donc utilisé la deuxième approche, en restructurant mes paquets et ça a marché ! Maintenant la structure de mes paquets est devenue comme ceci.

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

0 votes

Pas grand chose de changé en fait, j'ai juste renommé les paquets et les classes @GuoJing

0 votes

@ekaRudianto Il y a une faute de frappe. Pas d'ouverture { para scanBasePackages= "com.example.something","com.example.application"

0 votes

J'ai eu le même problème et j'ai découvert que la structure de mon paquet n'était pas dans le bon ordre. Je les ai réorganisés comme ceci et cela fonctionne bien maintenant.

138voto

dzzxjl Points 431

Ajouter le @Service dans le service/UserService.java.

42voto

shabby Points 197

J'ai également 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 paquets 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);
    }
}

Si vous devez en ajouter plusieurs, n'oubliez pas les accolades :

@EnableMongoRepositories(basePackageClasses
    = {
        MSASMSRepository.class, APartyMappingRepository.class
    })

17voto

Akash Yellappa Points 387

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

13voto

Ce fil de discussion est maintenant ancien mais je publie ma réponse, qui peut être utile à d'autres.

J'ai eu le même problème. Il s'est avéré qu'il y a 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X