Je reçois l'erreur suivante:
***************************
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.
Je n'ai jamais vu cette erreur auparavant, mais il est étrange que @Autowire ne fonctionne pas. Voici la structure du projet:
Interface du candidat
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;
}
DemandeurImpl
@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;
}
}
Maintenant, je devrais pouvoir simplement utiliser Autowire Applicant et pouvoir y accéder, mais dans ce cas, cela ne fonctionne pas lorsque je l'appelle dans mon @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";
}
}
------------------------ MISE À JOUR 1 -----------------------
J'ai ajouté
@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);
}
}
et l'erreur est partie mais rien ne s'est produit. Cependant , lorsque je commentais sur tout ce qui touche à Applicant
la RestController
avant d'ajouter que @ComponentScan()
j'ai pu retourner une chaîne la UI
, ce qui signifie donc mon RestController
travaillait, maintenant il est sauté. Je moche Whitelabel Error Page
maintenant.
--------------------- MISE À JOUR 2 --------------------------- ---
J'ai ajouté le paquet de base du haricot dont il se plaignait. L'erreur lit:
***************************
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.
J'ai ajouté @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);
}
}
---------------------------- Mise à jour 3 -------------------- -
ajouter:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
se plaint toujours de ma ApplicantImpl
classe dans laquelle @Autowires
mon dépôt TApplicantRepository
en elle.
la source
Réponses:
Cela peut être dû au fait que le projet a été divisé en différents modules.
la source
@EntityScan
et@EnableJpaRepositories
avec les bons noms de paquet a fonctionné pour moi.Il y a une chance ...
peut - être manquant
@Service
,@Repository
annotation sur vos classes d'implémentation respectives.la source
Votre classe de candidat n'est pas numérisée semble-t-il. Par défaut, tous les paquets commençant par la racine comme classe où vous avez mis
@SpringBootApplication
seront analysés.supposons que votre
main
classe "WebServiceApplication" soit dans "com.service.something
", alors tous les composants qui tombent sous "com.service.something
" sont analysés, et "com.service.applicant
" ne seront pas analysés.Vous pouvez soit restructurer vos packages de telle sorte que "WebServiceApplication" tombe sous un package racine et que tous les autres composants deviennent une partie de ce package racine. Ou vous pouvez inclure
@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
etc de telle sorte que "TOUS" les composants soient scannés et initialisés dans le conteneur à ressort.Mise à jour basée sur le commentaire
Si vous avez plusieurs modules gérés par maven / gradle, tout ce dont Spring a besoin est le package à analyser. Vous dites à spring de scanner "com.module1" et vous avez un autre module dont le nom de package racine est "com.module2", ces composants ne seront pas analysés. Vous pouvez même demander à Spring de scanner "com" qui analysera ensuite tous les composants dans "
com.module1.
" et "com.module2.
"la source
build.gradle
. Cesbuild.gradle
noms de module sont ajoutés audependencies
module avec la méthode main. Par conséquent, quand vous avez vu@ComponentScan("module-service")
que je pensais que cela fonctionnerait. Cependant à l'intérieurmodule-service
a un paquet. Alors ma question à quoi cela ressemblerait-il? Dois-je simplement nommer le nom du package ou le nom du module ou les deux?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@SpringBootApplication(scanBasePackages= "com")
et il se plaint du référentiel JPA. Merci beaucoup. Je ne savais pas que Spring analyserait tous les paquets commençant par "com" si vous faites ce qui précède.Fondamentalement, cela se produit lorsque vous avez votre application de classe dans "un autre package". Par exemple:
Je résous le problème avec cela dans Application.class
Une autre manière moins élégante est de: mettre toutes les classes de configuration dans le même package.
la source
@ComponentScan
dans le scénario ci-dessus. Parce que votreApplication.class
(qui a l'@SpringBootApplication
annotation) est placé danscom.server
lequel est de toute façon la racine pour les deuxcom.server.config
ainsi que pourcom.server.repository
.@EnableMongoRepositories
?Dans mon cas, j'ai eu une terrible erreur. je mets
@Service
place l'interface de service.Pour résoudre ce problème, j'ai mis
@Service
sur l'implémentation du fichier de service et cela a fonctionné pour moi.la source
Si un bean est dans le même package dans lequel il est @Autowired, cela ne causera jamais un tel problème. Cependant, les beans ne sont pas accessibles par défaut à partir de différents packages. Pour résoudre ce problème, procédez comme suit:
import org.springframework.context.annotation.ComponentScan;
la source
Je pense que vous pouvez le simplifier en annotant votre référentiel avec @Repository, puis il sera activé automatiquement par Spring Framework.
la source
Dans mon cas, ces deux options ont fonctionné.
in
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
inclure également le package qui contient leApplication.class
dans la liste, ouAjoutez simplement
@EnableAutoConfiguration
; il reconnaît automatiquement tous les haricots de printemps.la source
Cela peut également se produire si vous utilisez Lombok et que vous ajoutez les champs
@RequiredArgsConstructor
et@NonNull
for mais que certains de vos champs ne doivent pas être injectés dans le constructeur. Ce n'est qu'une des possibilités d'obtenir la même erreur.Dans mon cas, l'erreur m'a indiqué dans quel contrôleur se trouvait le problème, après la suppression de
@NonNull
l'application a bien démarréla source
J'ai rencontré un problème familier dans mon projet multi-module Maven avec Spring Boot 2. Le problème était lié à la dénomination de mes packages dans les sous-modules Maven.
@SpringBootApplication incapsule un grand nombre de composants tels que - @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization et ainsi de suite. Et il place @ComponentScan dans com. *******. Space package. Cette partie des packages com. *******. Space doit être commune à tous les modules.
Pour le réparer:
la source
J'ai cherché une réponse en ligne mais il semble qu'il n'y ait pas de solution unique à mon cas: au tout début, tout fonctionne bien comme suit:
Ensuite, j'essaie d'ajouter une carte pour mettre en cache quelque chose et cela devient ceci:
Boom!
J'ai supprimé le
@AllArgsConstructor(onConstructor = @__(@Autowired))
et ajouter@Autowired
pour chacunrepository
etservice
sauf leMap<String, String>
. Cela fonctionne comme avant.J'espère que cela pourrait être utile.
la source
Cela a fonctionné pour moi après avoir ajouté l'annotation ci-dessous dans l'application:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
J'obtenais l'erreur ci-dessous:
la source
L'annotation @Configuration résoudra simplement l'erreur
la source
Vous obtiendrez également cette erreur si vous définissez accidentellement le même bean dans deux classes différentes. Cela m'est arrivé. Le message d'erreur était trompeur. Lorsque j'ai supprimé le bean supplémentaire, le problème a été résolu.
la source
la source
Cela peut se produire si la classe @Service est marquée comme abstraite.
la source
Si votre dépendance de classe est gérée par Spring, ce problème peut se produire si nous avons oublié d'ajouter le constructeur arg par défaut / vide dans notre classe POJO.
la source
Cela pourrait aider quelqu'un. J'ai eu le même problème, le même message d'erreur, le même tout. J'ai essayé des solutions d'autres réponses, je n'ai pas aidé jusqu'à ce que je me rende compte que le bean que j'utilise porte le même nom que celui qui est en fait câblé automatiquement. Cela s'est passé au milieu du refactor, j'ai donc dû renommer la classe, ce qui a abouti de manière positive. À votre santé
la source
J'ai fait face au même problème. Le référentiel Mongo DB a été identifié par Spring Boot, mais il ne créait pas de Bean pour une interface de référentiel qui étendait le référentiel mongo.
Le problème dans mon cas était une spécification de version incorrecte dans maven pom pour "spring + mango". J'ai changé l'identifiant de groupe de l'artefact et tout a fonctionné comme par magie. aucune annotation nécessaire car Spring Boot s'est occupé de tout.
Au cours de ma résolution de problème, j'étais partout sur le Web à la recherche de solutions et j'ai réalisé que ce problème était en fait lié à la configuration du projet, toute personne confrontée à ce problème devrait d'abord vérifier la configuration de son projet et activer le débogage à partir du printemps pour obtenir plus de détails sur l'échec et porter une attention particulière à où exactement dans le processus, la création a échoué.
la source
Dans mon cas, cette erreur apparaît car mon importation était incorrecte, par exemple, en utilisant le ressort, l'importation apparaît automatiquement:
mais j'avais besoin de:
la source
J'ai eu un cas où j'ai besoin d'injecter RestTemplate dans une classe de service. Toutefois, le RestTemplate ne peut pas être récupéré par la classe de service. Ce que j'ai fait, c'est de créer une classe de wrapper sous le même package que l'application principale et de marquer le wrapper comme composant et de faire passer automatiquement ce composant dans la classe de service. Problème résolu. j'espère que cela fonctionne aussi pour vous
la source
Mon erreur était que j'avais inclus:
au lieu de:
la source
Je pense qu'il vous manque l'annotation @Bean dans votre RequestController
Ajoutez le Bean dans votre fichier, cela a résolu mon problème
J'ai obtenu cette solution pendant que j'apprenais Spring Boot à partir de tutorialspoint
la source
L'ajout de la dépendance Spring Boot Data JPA Starter a résolu le problème pour moi.
Maven
Gradle
Ou vous pouvez aller directement ici
la source
Si vous utilisez,
interface
vous pouvez étendreCrudRepository<Applicant,Long>
avec une@Repository
annotation.la source
Le problème peut également apparaître lorsque vous utilisez par exemple
@EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)
et que vous avez ultérieurement renommé le nom du package ou l'avez déplacé à un autre endroit.Très souvent confronté à cela dans un projet maven multi-module et spring boot
la source
Il est possible que vous essayiez de @autowired une interface avant d'implémenter l'interface.
exemple de solution:
la source
Supprimez la configuration de type d'annotation comme @Service de la méthode d'exécution de thread.
la source
Essayez de configurer la structure du projet comme indiqué ci-dessous:
Mettez tous les packages repo, service, packages dans le package enfant du package principal:
la source
rappel que spring ne scanne pas le monde, il utilise une analyse ciblée, ce qui signifie tout ce qui se trouve sous le paquet où springbootapplication est stockée. par conséquent, cette erreur «Pensez à définir un bean de type 'package' dans votre configuration [Spring-Boot]» peut apparaître car vous avez des interfaces de services dans un autre package springbootapplication.
la source