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 Applicant
dem RestController
vor der Zugabe @ComponentScan()
ich in der Lage war , eine Zeichenfolge , die die Rückkehr UI
, so bedeutete mein RestController
arbeiten, jetzt wird er übersprungen werden. Ich bin Whitelabel Error Page
jetzt 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 ApplicantImpl
Klasse, die @Autowires
mein Repo TApplicantRepository
hinein.
quelle
Antworten:
Dies kann daran liegen, dass das Projekt in verschiedene Module unterteilt wurde.
quelle
@EntityScan
und@EnableJpaRepositories
mit den richtigen Paketnamen für mich gearbeitet.Es gibt eine Chance ...
Sie könnten fehlen
@Service
,@Repository
Anmerkung auf Ihren jeweiligen Implementierungsklassen.quelle
Ihre Bewerberklasse wird anscheinend nicht gescannt. Standardmäßig werden alle Pakete
@SpringBootApplication
gescannt, die mit dem Stammverzeichnis als der Klasse beginnen, in die Sie sie eingefügt haben.Angenommen, Ihre
main
Klasse "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.quelle
build.gradle
. Diesebuild.gradle
Modulnamen werdendependencies
mit der Hauptmethode zum Modul hinzugefügt . Als du das gesehen hast@ComponentScan("module-service")
, dachte ich, dass es funktionieren würde. Im Innerenmodule-service
befindet sich jedoch ein Paket. Also meine Frage, wie würde das aussehen? Benenne ich nur den Paketnamen oder den Modulnamen oder irgendwie beides?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@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.Grundsätzlich geschieht dies, wenn Sie Ihre Klassenanwendung in einem "anderen Paket" haben. Beispielsweise:
Ich löse das Problem damit in der Application.class
Eine andere, weniger elegante Möglichkeit besteht darin, alle Konfigurationsklassen in dasselbe Paket zu packen.
quelle
@ComponentScan
im obigen Szenario nichts angeben . Weil IhrApplication.class
(das die@SpringBootApplication
Annotation hat) platziert ist, incom.server
dem sowieso die Wurzel sowohl fürcom.server.config
als auch istcom.server.repository
.@EnableMongoRepositories
?In meinem Fall hatte ich einen schrecklichen Fehler. ich lege
@Service
an die Serviceschnittstelle gewöhnt.Um das Problem zu beheben, habe ich
@Service
die Implementierung der Servicedatei aktiviert und es hat bei mir funktioniert.quelle
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 :
import org.springframework.context.annotation.ComponentScan;
quelle
Ich denke, Sie können es vereinfachen, indem Sie Ihr Repository mit @Repository kommentieren. Dann wird es automatisch von Spring Framework aktiviert.
quelle
In meinem Fall haben diese beiden Optionen funktioniert.
Dazu
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
gehört auch das Paket, das dasApplication.class
in der Liste enthält, oderEinfach hinzufügen
@EnableAutoConfiguration
; Es erkennt automatisch alle Frühlingsbohnen.quelle
Dies kann auch passieren, wenn Sie Lombok verwenden und die Felder
@RequiredArgsConstructor
und@NonNull
fü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.In meinem Fall hat mir der Fehler mitgeteilt, auf welchem Controller das Problem aufgetreten ist, nachdem das Entfernen
@NonNull
der Anwendung ordnungsgemäß gestartet wurdequelle
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:
quelle
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:
Dann versuche ich, eine Karte hinzuzufügen, um etwas zwischenzuspeichern, und es wird dies:
Boom!
Ich entfernte das
@AllArgsConstructor(onConstructor = @__(@Autowired))
und fügte@Autowired
für jedesrepository
undservice
außer das hinzuMap<String, String>
. Es funktioniert einfach wie zuvor.Hoffe das könnte hilfreich sein.
quelle
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:
quelle
Die Annotation @Configuration behebt nur den Fehler
quelle
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.
quelle
quelle
Dies kann passieren, wenn die @ Service-Klasse als abstrakt markiert ist.
quelle
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.
quelle
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
quelle
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.
quelle
In meinem Fall wird dieser Fehler angezeigt, weil mein Import falsch war. Wenn Sie beispielsweise spring verwenden, wird der Import automatisch angezeigt:
aber ich brauchte:
quelle
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
quelle
Mein Fehler war, dass ich aufgenommen hatte:
anstatt:
quelle
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
quelle
Durch Hinzufügen der Spring Boot Data JPA Starter-Abhängigkeit wurde das Problem für mich behoben.
Maven
Gradle
Oder Sie können direkt hierher gehen
quelle
Wenn Sie verwenden
interface
, können SieCrudRepository<Applicant,Long>
mit@Repository
Anmerkungen erweitern.quelle
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
quelle
Es besteht die Möglichkeit, dass Sie versuchen, eine Schnittstelle @autowired zu erstellen, bevor Sie die Schnittstelle implementieren.
Beispiellösung:
quelle
Entfernen Sie die Konfiguration des Annotationstyps wie @Service aus der Thread-Ausführungsmethode.
quelle
Versuchen Sie, die Projektstruktur wie folgt zu konfigurieren:
Fügen Sie alle Repo-, Service- und Paketpakete in das untergeordnete Paket des Hauptpakets ein:
quelle
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.
quelle