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 le @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 être en mesure de demander à Autowire Applicant de pouvoir 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 passé. Cependant, lorsque j'ai commenté tout ce qui traitait de Applicant
dans RestController
avant d'ajouter @ComponentScan()
, je pouvais renvoyer une chaîne de caractères UI
, ce qui signifiait que mon RestController
fonctionnait, maintenant il est sauté. Je moche Whitelabel Error Page
maintenant.
--------------------- UPDATE 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 {
continue à se plaindre de ma classe ApplicantImpl
dans laquelle @Autowires
mon compte _ TApplicantRepository
.
C'est peut-être parce que le projet a été divisé en différents modules.
@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
Il semble que votre classe de candidats ne soit pas scannée. Par défaut, tous les paquets commençant par la racine en tant que classe dans laquelle vous avez mis @SpringBootApplication
seront analysés.
supposez que votre classe main
"WebServiceApplication" se trouve dans "com.service.something
", tous les composants situés sous "com.service.something
" seront analysés et "com.service.applicant
" ne seront pas analysés.
Vous pouvez soit restructurer vos packages de sorte que "WebServiceApplication" tombe dans un package racine et que tous les autres composants en fassent partie. Vous pouvez également inclure @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
etc. de sorte que "TOUS" les composants soient analysés et initialisés dans le conteneur de ressort.
Mise à jour basée sur le commentaire
Si vous avez plusieurs modules gérés par maven/gradle, le package à analyser est le package à analyser. Vous indiquez à spring d'analyser "com.module1" et vous disposez d'un autre module dont le nom de package racine est "com.module2". Ces composants ne seront pas analysés. Vous pouvez même dire à spring d'analyser "com", qui analysera ensuite tous les composants de "com.module1.
" et de "com.module2.
"
Il y a une chance ...
Il se peut que vous manquiez de l'annotation @Service
, @Repository
sur vos classes d'implémentation respectives.
En gros, cela se produit lorsque vous avez votre application de classe dans "un autre package". Par exemple:
com.server
- Applicacion.class (<--this class have @ComponentScan)
com.server.config
- MongoConfig.class
com.server.repository
- UserRepository
Je résous le problème avec cela dans Application.class
@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem
n autre moyen moins élégant consiste à: placer toutes les classes de configuration dans le même package.
Je pense que vous pouvez le simplifier en annotant votre référentiel avec @Repository, puis il sera activé automatiquement par Spring Framework.
Dans mon cas, j'ai eu une terrible erreur. Je mets @Service
jusqu'à 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.
Cela peut également arriver si vous utilisez Lombok et que vous ajoutez les @RequiredArgsConstructor
et @NonNull
pour les champs, 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.
le paramètre 0 nécessitait un bean de type MissingBeanName introuvable.
Dans mon cas, l'erreur m'a dit quel contrôleur avait le problème, après avoir retiré @NonNull
l'application a bien démarré
Si un bean se trouve dans le même package dans lequel il est @Autowired, il 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 suivez ces étapes:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringExampleApplication.class, args);
}
}
Dans mon cas, ces deux options ont fonctionné.
dans //@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
include aussi le paquet contenant le Application.class
dans la liste, ou
Ajoutez simplement @EnableAutoConfiguration
; il reconnaît automatiquement tous les haricots de printemps.
J'ai cherché en ligne pour obtenir une réponse, mais il semble qu'il n'y ait pas de solution unique à mon cas: au tout début, tout fonctionne comme suit:
@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
private Repository repository;
private Service service;
}
Ensuite, j'essaie d'ajouter une carte pour mettre en cache quelque chose et cela devient ceci:
@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.
J'ai enlevé le @AllArgsConstructor(onConstructor = @__(@Autowired))
et ajouter @Autowired
pour chaque repository
et service
sauf le Map<String, String>
. Cela fonctionne comme avant.
@Slf4j
@Service
public class SecurityGroupService {
@Autowired
private Repository repository;
@Autowired
private Service service;
Map<String, String> testMap;
}
J'espère que cela pourrait être utile.
@SpringBootApplication
@MapperScan("com.developer.project.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Cela a fonctionné pour moi après avoir ajouté l'annotation ci-dessous dans l'application:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Je recevais l'erreur ci-dessous:
"Le paramètre 1 du constructeur dans requis un bean de type mappeur qui n'a pas pu être trouvé:
Cela peut arriver si la classe @Service est marquée comme abstraite.
Si votre dépendance de classe est gérée par Spring, ce problème peut survenir si nous avons oublié d'ajouter le constructeur arg par défaut/vide dans notre classe POJO.
Dans mon cas, cette erreur apparaît parce que mon importation était incorrecte. Par exemple, en utilisant spring, l'importation apparaît automatiquement:
import org.jvnet.hk2.annotations.Service;
mais j'avais besoin de:
import org.springframework.stereotype.Service;
J'ai eu un cas où j'ai besoin d'injecter RestTemplate dans une classe de service. Cependant, RestTemplate ne peut pas être récupéré par la classe de service. Ce que j'ai fait est de créer une classe wrapper dans le même package que l'application principale et de marquer le wrapper en tant que composant et d'autowire ce composant dans la classe de service. Problème résolu. espérons que cela fonctionne aussi pour vous