@Autowired – Aucun bean qualifiant de type trouvé pour la dépendance

J’ai commencé mon projet en créant des entités, des services et des tests JUnit pour les services utilisant Spring et Hibernate. Tout cela fonctionne très bien. Ensuite, j’ai ajouté spring-mvc pour rendre cette application Web utilisant de nombreux didacticiels pas à pas, mais lorsque j’essaie de faire de Controller une annotation @Autowired, je reçois des erreurs de Glassfish lors du déploiement. Je suppose que, pour une raison quelconque, Spring ne voit pas mes services, mais après plusieurs tentatives, je ne peux toujours pas le gérer.

Tests de services avec

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/beans.xml"}) 

et

 @Autowired MailManager mailManager; 

fonctionne correctement.

Contrôleurs sans @Autowired aussi, je peux ouvrir mon projet dans un navigateur Web sans problème.

/src/main/resources/beans.xml

       <!---->                   <!---->    org.hibernate.dialect.MySQLDialect           

/webapp/WEB-INF/web.xml

  Spring Web MVC Application  mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml   org.springframework.web.context.ContextLoaderListener   

/webapp/WEB-INF/mvc-dispatcher-servlet.xml

           

pl.com.radzikowski.webmail.service.AbstractManager

 package pl.com.radzikowski.webmail.service; import org.apache.log4j.Logger; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; /** * Master Manager class providing basic fields for services. * @author Maciej Radzikowski  */ public class AbstractManager { @Autowired protected SessionFactory sessionFactory; protected final Logger logger = Logger.getLogger(this.getClass()); } 

pl.com.radzikowski.webmail.service.MailManager

 package pl.com.radzikowski.webmail.service; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component @Transactional public class MailManager extends AbstractManager { // some methods... } 

pl.com.radzikowski.webmail.HomeController

 package pl.com.radzikowski.webmail.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import pl.com.radzikowski.webmail.service.MailManager; @Controller @RequestMapping("/") public class HomeController { @Autowired public MailManager mailManager; @RequestMapping(value = "/", method = RequestMethod.GET) public Ssortingng homepage(ModelMap model) { return "homepage"; } } 

Erreur:

 SEVERE: Exception while loading the app SEVERE: Undeployment failed for context /WebMail SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Désolé pour beaucoup de code, mais je ne sais plus ce qui peut causer cette erreur.

Ajoutée

J’ai créé l’interface:

 @Component public interface IMailManager { 

outils ajoutés:

 @Component @Transactional public class MailManager extends AbstractManager implements IMailManager { 

et changé automatiquement:

 @Autowired public IMailManager mailManager; 

Mais il jette toujours des erreurs (même lorsque j’ai essayé avec @Qualifier)

..Ce ne peut pas envoyer automatiquement le champ: public pl.com.radzikowski.webmail.service.IMailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager …

J’ai essayé avec différentes combinaisons de @Component et @Transactional.

Ne devrais-je pas inclure beans.xml dans web.xml?

Vous devez envoyer l’interface AbstractManager place de la classe MailManager . Si vous avez différentes implémentations de AbstractManager vous pouvez écrire @Component("mailService") puis @Autowired @Qualifier("mailService") pour créer une classe spécifique.

Cela est dû au fait que Spring crée et utilise des objects proxy basés sur les interfaces.

J’ai eu ceci parce que mes tests n’étaient pas dans le même paquet que mes composants. (J’avais renommé mon package de composants, mais pas mon package de test.) Et j’utilisais @ComponentScan dans ma classe de test @Configuration , donc mes tests ne trouvaient pas les composants sur lesquels ils s’appuyaient.

Donc, vérifiez bien si vous obtenez cette erreur.

Le fait est que le contexte d’application et le contexte d’application Web sont tous deux enregistrés dans WebApplicationContext lors du démarrage du serveur. Lorsque vous exécutez le test, vous devez indiquer explicitement les contextes à charger.

Essaye ça:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"}) 

J’ai passé beaucoup de temps avec ça! Ma faute! Plus tard, j’ai constaté que la classe sur laquelle je déclarais l’annotation Service ou Component était de type abstract. Avait activé les journaux de débogage sur Springframework mais aucun indice n’était reçu. Veuillez vérifier si la classe est de type abstrait. Si alors, la règle de base appliquée, ne peut pas instancier une classe abstraite.

Pouvez-vous essayer d’annoter uniquement votre implémentation concrète avec @Component ? Peut-être que la réponse suivante pourrait aider. C’est un genre de problème similaire. Je mets généralement les annotations Spring dans les classes d’implémentation.

https://stackoverflow.com/a/10322456/2619091

Je suis tombé sur cela récemment, et comme il s’est avéré, j’ai importé la mauvaise annotation dans ma classe de service. Netbeans a une option pour masquer les instructions d’importation, c’est pourquoi je ne l’ai pas vu depuis un certain temps.

J’ai utilisé @org.jvnet.hk2.annotations.Service au lieu de @org.springframework.stereotype.Service .

La manière correcte sera d’automatiser AbstractManager, comme Max l’a suggéré, mais cela devrait bien fonctionner aussi.

 @Autowired @Qualifier(value="mailService") public MailManager mailManager; 

et

 @Component("mailService") @Transactional public class MailManager extends AbstractManager { } 
  • Une des raisons pour lesquelles BeanB n’existe pas dans le contexte
  • L’existence de deux haricots constitue une autre cause d’exception.
  • Ou les définitions dans le bean context qui n’est pas défini sont demandées par nom dans le contexte Spring

voir plus cette url:

http://www.baeldung.com/spring-nosuchbeandefinitionexception

Je suppose que c’est ici

    

Toutes les annotations sont d’abord désactivées par use-default-filters = “false”, puis seule l’annotation @Controller est activée. Ainsi, votre annotation @Component n’est pas activée.

Si vous testez votre contrôleur. N’oubliez pas d’utiliser @WebAppConfiguration sur votre classe de test.

   

même problème est arrivé, je l’ai résolu en gardant les annotations intactes et dans dispatcher servlet :: en gardant l’parsing du paquet de base comme com.*. Cela a fonctionné pour moi.

J’ai eu ceci parce que j’ai ajouté une dépendance automatique à ma classe de service mais j’ai oublié de l’append aux simulacres injectés dans mon test d’unité de service.

L’exception de test unitaire semblait signaler un problème dans la classe de service lorsque le problème était en réalité dans le test unitaire. Rétrospectivement, le message d’erreur m’a dit exactement quel était le problème.

Au lieu de @Autowire MailManager mailManager, vous pouvez simuler le bean comme indiqué ci-dessous:

 import org.springframework.boot.test.mock.mockito.MockBean; :: :: @MockBean MailManager mailManager; 

En outre, vous pouvez configurer @MockBean MailManager mailManager; séparément dans la classe @SpringBootConfiguration et initialiser comme ci-dessous:

 @Autowire MailManager mailManager 

Cela peut vous aider:

J’ai la même exception dans mon projet. Après avoir cherché pendant que je trouvais que je manquais de l’annotation @Service à la classe où j’implémente l’interface que je veux @Autowired.

Dans votre code, vous pouvez append l’annotation @Service à la classe MailManager.

 @Transactional @Service public class MailManager extends AbstractManager implements IMailManager {