it-swarm.com.de

"Field benötigte eine Bean, die nicht gefunden werden konnte." Fehler Spring Restful API mit Mongodb

Also habe ich den Frühling in den Paaren der Woche gelernt und diesem Tutorial gefolgt

Aufbau eines RESTful-Webdienstes

Alles war gut, bis ich versuchte, es in Mongodb zu integrieren. Also folge ich diesem Tutorial.

Zugriff auf Daten mit MongoDB

Aber meine Praxis verwendet teilweise immer noch den ersten. So ist meine Projektverzeichnisstruktur so.

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

Dies ist meine model/User.Java Datei

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

Dies ist meine rest/UsersController.Java Datei

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

Dies ist meine service/UserService.Java -Datei

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

Ich könnte sie kompilieren (ich benutze gradle zum Kompilieren, weil ich dem Tutorial folge), aber wenn ich die JAR-Datei starte, wurde dieser Fehler ausgelöst.


Die Anwendung ist nicht startfähig


Beschreibung:

Das Feld userService in main.Java.rest.UsersController erforderte eine Bean von Geben Sie 'main.Java.service.UserService' ein, der nicht gefunden werden konnte.

Aktion:

Erwägen Sie die Definition eines Beans vom Typ 'main.Java.service.UserService' in Ihre Konfiguration.

Nicht sicher, was falsch ist, fang ich an zu googeln und habe festgestellt, dass ich die Beans.xml-Datei einbeziehen und den userService darin registrieren muss. Ich habe das gemacht, aber es funktioniert nicht. Ich bin wirklich neu in diesem Bereich, daher habe ich keine Ahnung, was los ist.

47
Eka Rudianto

Ich habe es gelöst. Standardmäßig werden alle Pakete, die unter @SpringBootApplication-Deklaration fallen, gescannt.

Angenommen, meine Hauptklasse ExampleApplication, die die @SpringBootApplication-Deklaration hat, ist in com.example.something deklariert, dann werden alle Komponenten, die unter com.example.something fallen, durchsucht, während com.example.applicant nicht gescannt wird.

Es gibt also zwei Möglichkeiten, dies basierend auf dieser Frage zu tun. Benutzen

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

Auf diese Weise scannt die Anwendung alle angegebenen Komponenten, aber ich denke, was wäre, wenn der Maßstab größer würde? 

Also benutze ich den zweiten Ansatz, indem ich meine Pakete umstrukturiere und es hat funktioniert! Nun wurde meine Paketstruktur so.

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

Fügen Sie den @Service im Dienst/UserService.Java hinzu.

43
dzzxjl

Ich hatte auch den gleichen Fehler:

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

Und meine Pakete wurden auf die gleiche Weise konstruiert, wie in der akzeptierten Antwort erwähnt. Ich habe mein Problem behoben, indem ich die EnableMongoRepositories-Annotation in der Hauptklasse wie folgt hinzugefügt habe:

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

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

Ich hatte das gleiche Problem und alles, was ich tun musste, war, die Anwendung in einem Paket zu platzieren, das eine Stufe höher war als die Service-, Dao- und Domain-Pakete.

8
Akash Yellappa

Dieser Thread ist jetzt alt, aber ich poste meine Antwort, was für andere nützlich sein kann.

Ich hatte das gleiche Problem ... Es stellte sich heraus, dass es eine andere Klasse mit demselben Namen in einem anderen Modul gibt. Ich habe diese Klasse umbenannt und das Problem gelöst.

3

Verbrachte viel Zeit wegen des Auto-Imports Intellij Idea importierte @Service aus import org.jvnet.hk2.annotations.Service; statt import org.springframework.stereotype.Service;!

3
Vitali Kuzmin

Normalerweise können wir dieses Problem in zwei Aspekten lösen:

  1. die richtige Annotation sollte für Spring Bootverwendet werden. _ Scannen der Bean wie @Component;
  2. der Pfad scan enthält die Klassen ebenso wie alle anderen oben genannten. 

Es gibt übrigens eine sehr gute Erklärung für den Unterschied zwischen @Component, @Repository, @Service und @Controller .

2
Hearen

Fügen Sie die @Component Ihrer Controller-Klasse hinzu. Möge das funktionieren 

2
shubham bansal

Ich bin zu diesem Beitrag gekommen, um Hilfe bei der Verwendung von Spring Webflux mit Mongo Repository zu suchen.

Mein Fehler war dem Besitzer ähnlich

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

Da ich zuvor mit Spring MVC gearbeitet habe, war ich von diesem Fehler überrascht.

Weil es nicht so offensichtlich war, Hilfe zu finden, beantworte ich diese Frage, da sie irgendwie verwandt ist und diese Frage in den Suchergebnissen hoch ist.

Als Erstes müssen Sie sich daran erinnern, was in der Antwort als "Akzeptiert" bezeichnet wurde - Pakethierarchie.

Die zweite wichtige Sache ist, dass Sie, wenn Sie Webflux verwenden, ein anderes Paket verwenden müssen, während Sie Spring MVC verwenden, z. Für MongoDB müssen Sie hinzufügen

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

mit -reactive am Ende.

0

Die Verwendung von all @ Annotations hat mein Problem behoben. (Ja, ich bin neu in Spring.) Wenn Sie eine Serviceklasse verwenden, fügen Sie @Service hinzu, und das Gleiche gilt für @Controller und @Repository.

Dann haben diese Anmerkungen auf der App.Java das Problem behoben (ich verwende JPA + Hibernate)

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

Paketbaum:

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

Ich habe dasselbe Problem, das durch Adding @EnableMongoRepositories ("in.topthree.util") behoben wurde

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

}

Und mein Repository

 package in.topthree.util;

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

    public interface StudentMongo extends MongoRepository<Student, Integer> {

        public Student findByUrl(String url);
    }

Jetzt geht es

0
Ahmad

In meinem Fall habe ich beim Kopieren und Einfügen aus Versehen die Serviceklasse abstract definiert.

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

Sie müssen der Implementierung Ihres Dienstes die Anmerkung @Service hinzufügen.

0
Ahmed AMMOURI

Meine Mapper-Implementierungsklassen in meinem Zielordner wurden gelöscht, sodass meine Mapper-Schnittstellen keine Implementierungsklassen mehr hatten. Also ich habe den gleichen Fehler Field *** required a bean of type ***Mapper that could not be found.

Ich musste einfach meine Mapper-Implementierungen mit Maven neu generieren und das Projekt aktualisieren ...

0
RotS

In meinem Fall habe ich gerade die Klasse MyprojectApplication in ein Paket (com.example.start) mit demselben Level von Modell, Controller und Servicepaketen eingefügt.

0
Zain Elabidine