Erwägen Sie, in Ihrer Konfiguration eine Bean vom Typ 'package' zu definieren [Spring-Boot]

108

Ich erhalte die folgende Fehlermeldung:

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

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Ich habe diesen Fehler noch nie gesehen, aber es ist seltsam, dass @Autowire nicht funktioniert. Hier ist die Projektstruktur:

Bewerberschnittstelle

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

BewerberImpl

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Jetzt sollte ich nur noch einen Autowire-Bewerber haben und darauf zugreifen können. In diesem Fall funktioniert es jedoch nicht, wenn ich es in meinem aufrufe @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ UPDATE 1 -----------------------

Ich fügte hinzu

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

und der Fehler ging weg, aber nichts passierte. Allerdings , wenn ich alles Umgang kommentierte heraus mit Applicantdem RestControllervor der Zugabe @ComponentScan()ich in der Lage war , eine Zeichenfolge , die die Rückkehr UI, so bedeutete mein RestControllerarbeiten, jetzt wird er übersprungen werden. Ich bin Whitelabel Error Pagejetzt hässlich .

--------------------- UPDATE 2 --------------------------- --- ---.

Ich fügte das Basispaket der Bohne hinzu, über die es sich beschwerte. Fehler lautet:

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

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

Ich fügte hinzu @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

---------------------------- Update 3 -------------------- - -

Hinzufügen:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

beschwert sich immer noch über meine ApplicantImplKlasse, die @Autowiresmein Repo TApplicantRepositoryhinein.

Mike3355
quelle
Wo ist Ihre Anwendungskontextdatei? Wenn Sie keine haben, sollten Sie Spring einen Hinweis mit Anmerkungen wie @ComponentScan geben , um alle Beans verfügbar zu machen.
Mario Santini
@MarioSantini siehe Update 1
Mike3355
Ich gehe davon aus, dass sich nach jedem Update die Fehler geändert haben. Wenn möglich, veröffentlichen Sie Ihre Projektstruktur und die Fehlerprotokolle / Stacktrace in jedem Fall. Es ist besser zu wissen, warum dieser Fehler aufgetreten ist, als dass ein "Etwas" den Fehler behoben hat. Wird für andere hilfreich sein, die ebenfalls auf ein ähnliches Problem stoßen.
Ameen.M

Antworten:

200

Dies kann daran liegen, dass das Projekt in verschiedene Module unterteilt wurde.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
Mike3355
quelle
5
Cool. Mein Projekt ist durch mehrere Module unterteilt. ComponentScan hat mein Problem gelöst!
Kholofelo Maloma
ComponentScan Annotation behebt mein Problem, aber @EnableAutoConfiguration nicht
jpl
Tatsächlich definiert EnableAutoConfiguration implizit ein Basis-Suchpaket für bestimmte Elemente und die Verwendung eines Root-Pakets ermöglicht auch die Verwendung der ComponentScan-Annotation, ohne dass ein basePackage-Attribut angegeben werden muss. Und @SpringBootApplication Annotation könnte verwendet werden, wenn Ihre Hauptklasse im
Stammpaket ist
1
Diese Lösung half mir mit diesem Fehler in Version 2.0.4
manu muraleedharan
2
Ja, das liegt daran, dass das Projekt in verschiedene Module unterteilt wurde. @EntityScanund @EnableJpaRepositoriesmit den richtigen Paketnamen für mich gearbeitet.
Adi Sivasankaran
51

Es gibt eine Chance ...
Sie könnten fehlen @Service, @RepositoryAnmerkung auf Ihren jeweiligen Implementierungsklassen.

CodeWorld
quelle
2
Dies sollte die akzeptierte Antwort sein, einfach und auf den Punkt gebracht. Danke dir.
Nachtwut
1
Hat für mich gearbeitet. Vielen Dank.
Okafor T Kosiso
1
Vielen Dank, mir fehlte @Repository Annotation
Sergodeeva
1
Ja, das sollte die Antwort sein. Bei den obigen Antworten wird lediglich davon ausgegangen, dass der Scan fehlgeschlagen ist, was falsch ist.
Sumit Badsara
48

Ihre Bewerberklasse wird anscheinend nicht gescannt. Standardmäßig werden alle Pakete @SpringBootApplicationgescannt, die mit dem Stammverzeichnis als der Klasse beginnen, in die Sie sie eingefügt haben.

Angenommen, Ihre mainKlasse "WebServiceApplication" befindet sich in " com.service.something", dann werden alle Komponenten, die unter " com.service.something" fallen, gescannt und " com.service.applicant" wird nicht gescannt.

Sie können Ihre Pakete entweder so umstrukturieren, dass "WebServiceApplication" unter ein Root-Paket fällt und alle anderen Komponenten Teil dieses Root-Pakets werden. Oder Sie können @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})usw. so einfügen, dass "ALLE" Komponenten im Federbehälter gescannt und initialisiert werden.

Update basierend auf Kommentar

Wenn Sie mehrere Module haben, die von maven / gradle verwaltet werden, ist nur das zu scannende Paket erforderlich. Sie weisen spring an, "com.module1" zu scannen, und Sie haben ein anderes Modul, dessen Stammpaketname "com.module2" lautet. Diese Komponenten werden nicht gescannt. Sie können spring sogar anweisen, "com" zu scannen, wodurch alle Komponenten in " com.module1." und " com.module2." gescannt werden.

Ameen.M
quelle
Mein Projekt ist Struktur ist verschiedene Module. Zum Beispiel haben die Dienste ein eigenes Modul und build.gradle. Diese build.gradleModulnamen werden dependenciesmit der Hauptmethode zum Modul hinzugefügt . Als du das gesehen hast @ComponentScan("module-service"), dachte ich, dass es funktionieren würde. Im Inneren module-servicebefindet sich jedoch ein Paket. Also meine Frage, wie würde das aussehen? Benenne ich nur den Paketnamen oder den Modulnamen oder irgendwie beides?
Mike3355
Es spielt keine Rolle, ob die Pakete in verschiedene Module fallen. Die Pakete, in denen die Komponenten gescannt werden sollen, sollten auf Feder festgelegt werden. Sie können alle "root" -Paketnamen aller Ihrer Module im Attribut "scanBasePackages" angeben. Und es sind alle "Pakete", die erwähnt werden müssen, keine Module.
Ameen.M
Haben Sie getan, was Sie gesagt haben, und der Fehler ist verschwunden, aber Sie haben sich nur über ein weiteres Paket beschwert. Natürlich habe ich es der Liste hinzugefügt, aber es wird nicht verschwinden. Ich habe es so implementiert:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355
Ich habe es gerade getan @SpringBootApplication(scanBasePackages= "com")und es beschwert sich über das JPA-Repository. Vielen Dank. Ich wusste nicht, dass Spring alle Pakete scannen würde, die mit "com" beginnen, wenn Sie die oben genannten Schritte ausführen.
Mike3355
23

Grundsätzlich geschieht dies, wenn Sie Ihre Klassenanwendung in einem "anderen Paket" haben. Beispielsweise:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Ich löse das Problem damit in der Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Eine andere, weniger elegante Möglichkeit besteht darin, alle Konfigurationsklassen in dasselbe Paket zu packen.

Carlos Marcano
quelle
2
Tatsächlich müssen Sie @ComponentScanim obigen Szenario nichts angeben . Weil Ihr Application.class(das die @SpringBootApplicationAnnotation hat) platziert ist, in com.serverdem sowieso die Wurzel sowohl für com.server.configals auch ist com.server.repository.
Ameen.M
@ Ameen.MDas ist meine genaue Frage: Warum kann es immer noch nicht gelöst werden und warum muss explizit nach den Mongo-Repos gesucht werden @EnableMongoRepositories?
Karthikeyan
10

In meinem Fall hatte ich einen schrecklichen Fehler. ich lege@Service an die Serviceschnittstelle gewöhnt.

Um das Problem zu beheben, habe ich @Servicedie Implementierung der Servicedatei aktiviert und es hat bei mir funktioniert.

Mohammad Falahi
quelle
Auch für mich. Danke
Manta
7

Wenn sich eine Bean in demselben Paket befindet, in dem sie @Autowired ist, wird dies niemals ein solches Problem verursachen. Auf Beans kann jedoch standardmäßig nicht von verschiedenen Paketen aus zugegriffen werden. Gehen Sie folgendermaßen vor, um dieses Problem zu beheben :

  1. Importieren Sie Folgendes in Ihre Hauptklasse:
    import org.springframework.context.annotation.ComponentScan;
  2. Fügen Sie Ihrer Hauptklasse Anmerkungen hinzu:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
ASHWANI PANDEY
quelle
5

Ich denke, Sie können es vereinfachen, indem Sie Ihr Repository mit @Repository kommentieren. Dann wird es automatisch von Spring Framework aktiviert.

Tushar Saha Chowdhury
quelle
4

In meinem Fall haben diese beiden Optionen funktioniert.

  1. Dazu //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) gehört auch das Paket, das das Application.classin der Liste enthält, oder

  2. Einfach hinzufügen @EnableAutoConfiguration; Es erkennt automatisch alle Frühlingsbohnen.

Sriharsha grv
quelle
3

Dies kann auch passieren, wenn Sie Lombok verwenden und die Felder @RequiredArgsConstructorund @NonNullfür hinzufügen , einige Ihrer Felder jedoch nicht in den Konstruktor eingefügt werden sollen. Dies ist nur eine der Möglichkeiten, um den gleichen Fehler zu erhalten.

Parameter 0 erforderte eine Bean vom Typ MissingBeanName, die nicht gefunden werden konnte

In meinem Fall hat mir der Fehler mitgeteilt, auf welchem ​​Controller das Problem aufgetreten ist, nachdem das Entfernen @NonNullder Anwendung ordnungsgemäß gestartet wurde

Dawid Gorczyca
quelle
3

Ich hatte in meinem Maven-Multimodulprojekt mit Spring Boot 2 ein bekanntes Problem. Das Problem hing mit der Benennung meiner Pakete in Sub-Maven-Modulen zusammen.

@SpringBootApplication enthält viele Komponenten wie - @ComponentScan, @EnableAutoConfiguration, jpa-Repositorys, json-serialization und so weiter. Und er platziert @ComponentScan im com. *******. Space-Paket. Dieser Teil des Pakets com. *******. Space muss für alle Module gleich sein.

Zur Behebung:

  1. Sie sollten alle Modulpakete umbenennen. Mit anderen Worten, die Sie in allen Paketen in allen Maven-Modulen haben mussten - der gleiche übergeordnete Teil. Zum Beispiel - com. *******. Space
  2. Außerdem müssen Sie Ihren Einstiegspunkt in dieses Paket verschieben - com. *******. Space
alexis_druzik
quelle
2

Ich habe online nach einer Antwort gesucht, aber es scheint, dass es keine richtige Lösung für meinen Fall gibt: Am Anfang funktioniert alles wie folgt:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Dann versuche ich, eine Karte hinzuzufügen, um etwas zwischenzuspeichern, und es wird dies:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Boom!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Ich entfernte das @AllArgsConstructor(onConstructor = @__(@Autowired))und fügte @Autowiredfür jedes repositoryund serviceaußer das hinzu Map<String, String>. Es funktioniert einfach wie zuvor.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Hoffe das könnte hilfreich sein.

Gehört
quelle
2

Es hat bei mir funktioniert, nachdem ich die folgenden Anmerkungen in der Anwendung hinzugefügt habe:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Ich habe den folgenden Fehler erhalten:

"Parameter 1 des Konstruktors in erforderte eine Bean vom Typ Mapper, die nicht gefunden werden konnte:

Liebe Kumar
quelle
2

Die Annotation @Configuration behebt nur den Fehler

oludamilare olukotun
quelle
2

Dieser Fehler wird auch angezeigt, wenn Sie versehentlich dieselbe Bean in zwei verschiedenen Klassen definieren. Das ist mir passiert. Die Fehlermeldung war irreführend. Als ich die zusätzliche Bean entfernte, wurde das Problem behoben.

Ross Mills
quelle
1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Entwickler07
quelle
1

Dies kann passieren, wenn die @ Service-Klasse als abstrakt markiert ist.

Ariel
quelle
1

Wenn Ihre Klassenabhängigkeit bis zum Frühjahr verwaltet wird, kann dieses Problem auftreten, wenn wir vergessen haben, in unserer POJO-Klasse einen Standard- / leeren Arg-Konstruktor hinzuzufügen.

Arif Khan
quelle
1

Es könnte jemandem helfen. Ich hatte das gleiche Problem, die gleiche Fehlermeldung, das gleiche alles. Ich habe Lösungen aus anderen Antworten ausprobiert und nicht geholfen, bis mir klar wurde, dass die von mir verwendete Bohne denselben Namen hat wie die, die tatsächlich automatisch verdrahtet wurde. Es passierte mitten im Refactor, daher musste ich die Klasse umbenennen, was sich positiv auswirkte. Prost

Staxx
quelle
1

Ich stand vor dem gleichen Problem. Das Mongo DB-Repository wurde durch Spring Boot identifiziert, es wurde jedoch kein Bean für eine Repository-Schnittstelle erstellt, die das Mongo-Repository erweiterte.

Das Problem in meinem Fall war eine falsche Versionsspezifikation in maven pom für "spring + mango". Ich habe die Gruppen-ID des Artefakts geändert und alles hat wie Magie funktioniert. Es sind keine Anmerkungen erforderlich, da sich der Frühlingsstiefel um alles kümmert.

Während meiner Problemlösung war ich im gesamten Web auf der Suche nach Lösungen und stellte fest, dass dieses Problem tatsächlich mit der Projektkonfiguration zusammenhängt. Jeder, der mit diesem Problem konfrontiert ist, sollte zuerst seine Projekteinrichtung überprüfen und das Debuggen ab Frühjahr aktivieren, um weitere Details zu Fehlern zu erhalten und genau darauf zu achten Wo genau im Prozess ist die Erstellung fehlgeschlagen.

user13650952
quelle
0

In meinem Fall wird dieser Fehler angezeigt, weil mein Import falsch war. Wenn Sie beispielsweise spring verwenden, wird der Import automatisch angezeigt:

import org.jvnet.hk2.annotations.Service;

aber ich brauchte:

import org.springframework.stereotype.Service;
Washington da Silva
quelle
0

Ich hatte einen Fall, in dem ich RestTemplate in eine Serviceklasse injizieren muss. Das RestTemplate kann jedoch nicht von der Serviceklasse abgerufen werden. Ich habe eine Wrapper-Klasse unter demselben Paket wie die Hauptanwendung erstellt, den Wrapper als Komponente markiert und diese Komponente in der Serviceklasse automatisch verdrahtet. Problem gelöst. hoffe es funktioniert auch bei dir

user11976602
quelle
0

Mein Fehler war, dass ich aufgenommen hatte:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

anstatt:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
user1441323
quelle
0

Ich denke, Sie vermissen die @ Bean-Annotation in Ihrem RequestController

Fügen Sie die Bean in Ihre Datei ein. Dies hat mein Problem gelöst.
Ich habe diese Lösung erhalten, als ich Spring Boot von tutorialspoint gelernt habe

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}
user3709901
quelle
0

Durch Hinzufügen der Spring Boot Data JPA Starter-Abhängigkeit wurde das Problem für mich behoben.

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

Oder Sie können direkt hierher gehen

Johny Thomas Kariath
quelle
Dies gilt in diesem Fall eigentlich nicht. Es werden Sie aufgefordert, Verbindungsdetails zur Datenbank anzugeben (Fehler beim Konfigurieren einer DataSource: Das Attribut 'url' wurde nicht angegeben und es konnte keine eingebettete Datenquelle konfiguriert werden.) In einer Situation, in der ich manuell testen möchte, ohne mit der Datenbank zu interagieren, funktioniert dies nicht.
Thomas Okonkwo
0

Wenn Sie verwenden interface, können Sie CrudRepository<Applicant,Long>mit @RepositoryAnmerkungen erweitern.

zawhtut
quelle
0

Das Problem kann auch auftreten, wenn Sie ein Beispiel verwenden @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)und später den Paketnamen umbenennen oder an einen anderen Ort verschieben.

Sehr oft konfrontiert es in einem Multi-Modul-Maven-Projekt und Spring Boot

Redoff
quelle
0

Es besteht die Möglichkeit, dass Sie versuchen, eine Schnittstelle @autowired zu erstellen, bevor Sie die Schnittstelle implementieren.

Beispiellösung:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)
Biddut
quelle
0

Entfernen Sie die Konfiguration des Annotationstyps wie @Service aus der Thread-Ausführungsmethode.

@Service, @Component
Sandun Susantha
quelle
0

Versuchen Sie, die Projektstruktur wie folgt zu konfigurieren:

Fügen Sie alle Repo-, Service- und Paketpakete in das untergeordnete Paket des Hauptpakets ein:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {
Barani r
quelle
0

Erinnern Sie daran, dass der Frühling die Welt nicht scannt, sondern gezielt scannt, was alles unter dem Paket bedeutet, in dem die Springboot-Anwendung gespeichert ist. Daher kann der Fehler "Erwägen Sie, eine Bean vom Typ 'package' in Ihrer Konfiguration [Spring-Boot] zu definieren" auftreten, weil Sie Dienstschnittstellen in einem anderen springbootapplication-Paket haben.

Popcornw
quelle