"Für das Feld war eine Bean vom Typ erforderlich, die nicht gefunden werden konnte." Fehler Spring Restful API mit Mongodb

90

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

Erstellen 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 die erste. Meine Projektverzeichnisstruktur ist also 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 Datei 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();
}

Ich konnte sie kompilieren (ich verwende gradle zum Kompilieren, weil ich dem Tutorial folge), aber als ich die JAR-Datei ausführte, wurde dieser Fehler ausgelöst.


ANWENDUNG NICHT STARTBAR


Beschreibung:

Für das Feld userService in main.java.rest.UsersController war eine Bean vom Typ 'main.java.service.UserService' erforderlich, die nicht gefunden werden konnte.

Aktion:

Definieren Sie in Ihrer Konfiguration eine Bean vom Typ 'main.java.service.UserService'.

Ich bin mir nicht sicher, was falsch ist. Ich beginne zu googeln und Beans.xmlstelle fest, dass ich eine Datei einschließen und den userService darin registrieren muss. Ich habe das getan, aber es funktioniert nicht. Ich bin wirklich neu in diesem Bereich, also habe ich wirklich keine Ahnung, was los ist.

Eka Rudianto
quelle

Antworten:

145

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

Angenommen, meine Hauptklasse ExampleApplicationmit @SpringBootApplicationDeklaration ist im Inneren deklariert com.example.something, dann werden alle Komponenten, unter die sie fallen, com.example.somethinggescannt, während com.example.applicantsie nicht gescannt werden.

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

@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! Jetzt 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
Eka Rudianto
quelle
Eigentlich hat sich nicht viel geändert, ich habe nur einige Umbenennungen der Pakete und der Klassen @GuoJing
Eka Rudianto
@ekaRudianto Es gibt einen Tippfehler. Keine Eröffnung {fürscanBasePackages= "com.example.something","com.example.application"
brk
Ich hatte auch das gleiche Problem und stellte fest, dass meine Paketstruktur nicht in der richtigen Reihenfolge war. Ich habe sie so neu arrangiert und es funktioniert jetzt gut.
Vimukthi Sineth
73

Fügen Sie die @Servicein der Datei service / UserService.java hinzu.

dzzxjl
quelle
19

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 der Hauptklasse folgende Annotation EnableMongoRepositories hinzugefügt habe:

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

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

Wenn Sie mehrere hinzufügen müssen, vergessen Sie nicht die geschweiften Klammern:

@EnableMongoRepositories(basePackageClasses
    = {
        MSASMSRepository.class, APartyMappingRepository.class
    })
schäbig
quelle
14

Ich bin auf dasselbe Problem gestoßen, und alles, was ich tun musste, war, die Anwendung in einem Paket zu platzieren, das eine Ebene höher als die Service-, Dao- und Domänenpakete ist.

Akash Yellappa
quelle
Können Sie die alte Paketstruktur (die nicht funktioniert hat) und die umstrukturierte Paketebene etwas genauer erläutern?
bemannt am
1
@mannedear: Ich kann nicht für das OP sprechen, aber in meinem Fall bin ich auf dieses Problem gestoßen, weil mein Code vom empfohlenen Layout abwich ( aufgetreten, abweicht docs.spring.io/spring-boot/docs/current/reference/html/… ): meine Anwendung Klasse stand nicht an der Spitze einer Pakethierarchie.
Luis
Ich habe mir die Haare abgezogen, um eine Lösung für dieses Problem zu finden, und Ihre Methode hat endlich funktioniert.
Chamithra Thenuwara
10

Verbrachte viel Zeit wegen des automatischen Imports. Intellij Idea irgendwie importiert @Servicevon import org.jvnet.hk2.annotations.Service;statt import org.springframework.stereotype.Service;!

Vitali Kuzmin
quelle
Könnten Sie Ihre Antwort aktualisieren und erklären, was Sie tun? Vielen Dank im Voraus
MZaragoza
3
Was Sie aus meiner Antwort nicht verstanden haben? Ich habe den gleichen Fehler wie in der Frage erhalten, als ich versucht habe, das Projekt auszuführen. Es war, weil ich Serviceaus der falschen Bibliothek importiert habe .
Vitali Kuzmin
@VitaliKuzmin noch gibt es keine Klarheit in Ihrer Antwort. Ihre Antwort mag richtig sein und es mag für Sie funktioniert haben, aber die Art und Weise, wie Sie hier dargestellt haben, ist verwirrend und nicht leserfreundlich
am
3
@mannedear Ich denke, mein erster Kommentar beantwortet auch Ihren Kommentar.
Vitali Kuzmin
+ 1'd diese Antwort, da ich auch einen Importfehler gemacht habe! : 0 import javax.persistence.Table;statt import org.springframework.data.relational.core.mapping.Table;in meinem Modell. smh hat 5 Stunden beim Debuggen dieses Bean-Fehlers verloren.
Kalpaj Agrawalla
10

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

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

Bhushan Karmarkar
quelle
7

Sie müssen die @ServiceAnmerkung zur Implementierung Ihres Dienstes hinzufügen .

Ahmed AMMOURI
quelle
4

Fügen Sie die @ -Komponente zu Ihrer Controller-Klasse hinzu. Möge dies funktionieren

Shubham Bansal
quelle
4

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

  1. richtige Anmerkung sollte verwendet werden für Frühling Boot - Scannen der Bohne , wie@Component ;
  2. Der Scanpfad enthält die Klassen wie alle anderen oben genannten.

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

Gehört
quelle
3

Fügen Sie @Repository in Ihre Dao-Klasse ein

Beispiel:

@Repository
public class DaoClassName implements IIntefaceDao {
}
sonOFAthena
quelle
2

Die Verwendung aller @ 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 in 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
Kashmir54
quelle
2

Ich habe das gleiche Problem , das durch Hinzufügen von @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 ist:

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

Ahmad
quelle
1

Meine Mapper-Implementierungsklassen in meinem Zielordner wurden gelöscht, sodass meine Mapper-Schnittstellen keine Implementierungsklassen mehr hatten. Somit habe ich den gleichen Fehler bekommenField *** 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 ...

RotS
quelle
1

Ich hatte das gleiche Problem. Mein Fehler war, dass ich die @ Service-Annotation auf der Service-Schnittstelle verwendet habe. Die Annotation @Service sollte auf die ServiceImpl-Klasse angewendet werden.

Ashish Singh
quelle
1

Fügen Sie @Repository zu Ihrer Dao-Klasse hinzu

    @Repository
    public interface UserDao extends CrudRepository<User, Long> {
         User findByUsername(String username);
         User findByEmail(String email);    
      }
Biddut
quelle
1

Ich hatte das gleiche Problem, dass ich die @ Autowired Annotation vom Controller entfernt habe. Wenn Ihr Repository eine Klasse ist, wird die Autowired Annotation benötigt, um das Repository zu verwenden. Wenn es sich jedoch um eine Schnittstelle handelt, müssen Sie die @ Autowired Annotation aus meiner Erfahrung nicht hinzufügen.

Mumbai
quelle
0

Dies kann passieren, wenn zwei Bohnen denselben Namen haben.

Module1Beans.java

@Configuration
public class Module1Beans {
    @Bean
    public GoogleAPI retrofitService(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.google.com/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        return retrofit.create(GoogleAPI.class);
    }
}

Module2Beans.java

@Configuration
public class Module2Beans {
    @Bean
    public GithubAPI retrofitService(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.github.com/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        return retrofit.create(GithubAPI.class);
    }
}

Eine Bean mit dem Namen retrofitServicewird zuerst erstellt, und ihr Typ ist GoogleAPI, dann wird sie durch eine Funktion GithubAPIabgedeckt, da beide durch eine retrofitService()Methode erstellt wurden. Jetzt, wenn Sie @Autowiredein erhalten GoogleAPISie eine Nachricht wieField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.

Benymor
quelle
0

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

Zain Elabidin
quelle
0

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

Mein Fehler war ähnlich wie beim Besitzer

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.

Da das Finden von Hilfe nicht so offensichtlich war, 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 als akzeptiert gekennzeichneten Antwort erwähnt wurde - Pakethierarchie.

Zweitens ist es wichtig, dass Sie bei Verwendung von Webflux ein anderes Paket verwenden müssen, während Sie bei Verwendung von Spring MVC, z. B. für MongoDB, hinzufügen müssen

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

mit -reaktiv am Ende.

Łukasz Kotyński
quelle
0

Ich weiß, dass es alt ist, aber ich möchte meine 5 Cent hinzufügen.

Ich habe .serviceund .service.implin einer Ordnerstruktur verwendet, um den Dienst mit seiner Implementierung zu trennen. Vergessen Sie, das ServiceImplementation-Teil zu implementieren.

Cyber
quelle
0

Sie müssen Spring-Boot-Starter-Data-JPA als Abhängigkeit importieren, wenn Sie Spring Boot verwenden

Duracell
quelle
0

Um eine Bean zu erstellen und zu injizieren, sollte die Klasse entsprechend dem Kontext in Ihrem Kontext mit @ Componet, @ service, @ Repository usw. markiert sein

package main.java.service;

import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
@Repository
public interface UserService extends MongoRepository<User, String> {
    public List<User> findAll();
}
Anwar Sir
quelle
0

Für mich diese Nachricht:

org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public org.package.MyClass(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. Might be it doesn't exist, may be it is not visible (public).

bedeutete "in meinem Wicket-Unit-Test oben müssen Sie diese Bohne manuell wie" hinzufügen "

appContext.putBean(myClass);
Rogerdpack
quelle
-1

Dies löste mein Problem.

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
Anand
quelle
Für mich hat das funktioniert, warum ist es -2?
vinicius gati