IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Définition de beans à l'intérieur d'une lib JAR


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Par défaut Définition de beans à l'intérieur d'une lib JAR
    Bonjour,

    Je travailles sur une architecture MVC.
    Depuis de front-end j'appelle un contrôleur (back-end) issu d'une de mes libraires.
    A ce moment là (donc dans ma lib JAR) , j’appelle mon service, qui lui appelle mon DAO.
    Jusque là tout ce passe bien.

    En fait, ce DAO est précédé de l'annotation @Autowired et c'est à ce moment que j'ai une erreur de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SOME_NAME': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: PROJECT.services.SERVICE_NAME PROJECT.controllers.CONTROLLER_NAME.SERVICE_NAME ; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SOME_NAME': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void PROJECT.services.SERVICE_NAME .FUNCTION_NAME(PROJECT.dao.DAO_NAME); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [PROJECT.dao.DAO_NAME] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    Le bean n'est pas initialisé si j'ai bien compris.

    Si vous avez des idée, ou besoin de plus informations, je reste à disposition.
    Merci d'avance,
    Cdlt

  2. #2
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Salut,


    Je pense qu'il te manque l'annotation @Repository au-dessus de ton bean DAO.

    Avant de déclarer un bean, par exemple un Dao dans un service, il faut s'assurer qu'il est "enregistré" par spring. Soit en mettant l'annotation qui lui correpond (@Repository, @Service, @Component...) et en ajoutant les balises "annotation-driven" et "annotation-config", soit en le déclarant (avec ses propriétés) dans le fichier de context (xml).

    Après cela, pour l'injecter, on peut utiliser @Autowired comme tu l'as fais.
    Et l'injection se fait sans problème. Après, et c'est peut-être hors sujet, si tu a deux beans qui ont le même nom et qui ne sont pas dans le même package, l'exception BeanCreationException est levée aussi.

    Pour cela, il faut ajouter l'annotation @Qualifier dans la déclaration et du coup, ajouter le nom du bean lorsque tu le déclare.

    Exemple :
    context.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [...]
    <context:annotation-config/>
    <context:component-scan base-package="com.mon.package" />
    [...]
    Bean1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package com.mon.package.numero.un
     
    @Repository(name="repo1")
    public class MonDao {
         [...]
    }
    Bean2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package com.mon.package.numero.deux
     
    @Repository(name="repo2")
    public class MonDao {
         [...]
    }
    Injection du bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Service
    public class MonService {
     
         @Autowired
         @Qualifier("repo1")
         private MonDao monRepo;
    }
    Attention, il y a une erreur dans mon code. J'aurais du injecter une interface mais je te laisse la corriger
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Le message dit clairement

    "No matching bean of type [PROJECT.dao.DAO_NAME] found for dependency"

    Il cherche un bean du type DAO_NAME, mais il n'en trouve aucun défini dans ton context spring. Du coup, il n'a rien à injecter et c'est un problème.


    Au passage, les noms de classes, commencent par une majscule et le reste en minuscule en java. Les noms de package, uniquement en minuscule. Respecte les conventions stp.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/11/2014, 22h57
  2. Réponses: 6
    Dernier message: 17/03/2014, 14h15
  3. définition d'une liste de personne dans une lib
    Par boboss123 dans le forum C
    Réponses: 14
    Dernier message: 13/12/2010, 12h36
  4. Réponses: 6
    Dernier message: 14/12/2008, 02h12
  5. Chargement d'une lib partagée C++ dans un programme C
    Par Zero dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/09/2003, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo