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 :

Problème avec l'annotation Autowired


Sujet :

Spring Java

  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut Problème avec l'annotation Autowired
    Salut,
    Je débute avec spring 3,
    J'ai commencé par un simple example spring avec hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    @Autowired 
    	//@Qualifier("userDao")
    	public void setDao(UserDao dao) {
    		this.dao = dao;
    		System.out.println("this.dao="+dao);
    	}
     
    	private void test()
    	{
    		GenericApplicationContext context = new GenericApplicationContext();
    		 XmlBeanDefinitionReader xmlReader = 
    		                 new XmlBeanDefinitionReader(context);
    		 xmlReader.loadBeanDefinitions(new ClassPathResource("app-config.xml"));   
    		 context.refresh();
    		   System.out.println(" dao="+ dao);
    		   User user = new User();
    			user.setAge(27);
    			user.setUserName("Adit");
    			user.setRegistered(true);			
    			dao.saveUser(user);
    		   System.out.println("done");
    	}
    Le problème est qu'a l'interieur de la methode setDao,l'objet dao n'est pas nulle,mais dans la methode test,je récupéré un objet dao null!!
    Quel est l'origine de ce problème?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Avec l'annotation tu n'es pas obligé d'avoir un setter. il suffit de déclarer ton field comme ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Autowired private UserDao dao;
    et tu peux l'utiliser dans ta classe. Mais ce qu eje ne comprends pas t'appelles l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenericApplicationContext
    sans lui indiquer le fichier xml à utiliser, enfin je ne connais pas ta technique. Donc si ta classe est déclarée à l'interieur du fichier le mieux c'est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenericApplicationContext context = new GenericApplicationContext("app-config.xml");
    et ne pas utiliser l'objet Xml... Autres choses pour récupérer un objet à l'intérieur de ton context il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserDao dao=context.getBean("beanName",UserDao.class);
    .

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Merci ray pour la réponse
    A propos la récupération des beans spring depuis le context,je sais queca fonctionne parfaitement
    Citation Envoyé par ray_fab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserDao dao=context.getBean("beanName",UserDao.class);
    .
    Mais ce que je voudrait savoir est pourquoi avec l'annotation @Autowired ,l'objet dao est non null dans le setter mais null en dehors?

  4. #4
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Bonjour,

    Dans ton exemple, tu as deux instances de la même classe.

    Tu as l'instance sur laquelle tu lances la méthode test().
    Cette méthode créé un contexte d'application Spring qui instance une nouvelle fois cette classe. Et au passage Spring appelle ton setter.

    Donc au final :
    - dans le setter (appelé par Spring), le dao est non null
    - dans la méthode test, le dao est null.

    Cordialement.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par gronono Voir le message
    Bonjour,

    Dans ton exemple, tu as deux instances de la même classe.

    Tu as l'instance sur laquelle tu lances la méthode test().
    Cette méthode créé un contexte d'application Spring qui instance une nouvelle fois cette classe. Et au passage Spring appelle ton setter.

    Donc au final :
    - dans le setter (appelé par Spring), le dao est non null
    - dans la méthode test, le dao est null.

    Cordialement.
    Merci gronomo pour votre aide,
    J'ai bien vérifié votre remarque en affichant le hashCode dans le setter et dans la méthode test:il s'agit bien deux valeurs différentes.
    Mais J'ai pas bien saisi pourquoi une telle situation et comment la résoudre.
    Merci

  6. #6
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Pour résoudre le problème, il faut récupérer le dao via Spring comme indiqué par ray_fab. La méthode test devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    private void test() {
        // Chargement de Spring => va créer une nouveau instance de cette classe
        GenericApplicationContext context = new GenericApplicationContext();
        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
        xmlReader.loadBeanDefinitions(new ClassPathResource("app-config.xml"));
        context.refresh();
     
        // Récupération de l'instance crée par Spring
        UserDao monDao = context.getBean("beanName", UserDao.class);
            System.out.println(" dao="+ monDao);
            User user = new User();
        user.setAge(27);
        user.setUserName("Adit");
        user.setRegistered(true);            
        monDao.saveUser(user);
        System.out.println("done");
    }
    Pour éviter le problème, on a deux 2 classes :
    - celle du service qui contient l'autowired vers le dao
    - celle du test ou du main qui initialise Spring.

Discussions similaires

  1. [MVC] Problème avec l'annotation @Autowired dans le @Controller
    Par rolandl dans le forum Spring Web
    Réponses: 0
    Dernier message: 31/12/2011, 02h18
  2. DuplicateMappingException : problème avec les annotations
    Par Spikuria dans le forum Hibernate
    Réponses: 1
    Dernier message: 30/08/2010, 17h26
  3. [Security] Problème avec methodSecurityInterceptor & annotations
    Par M.a.n.u. dans le forum Spring
    Réponses: 0
    Dernier message: 01/04/2009, 11h22
  4. [EJB3 Entity] Problème avec les annotations pour une List d'Enum
    Par uiscias dans le forum Java EE
    Réponses: 2
    Dernier message: 31/03/2009, 17h09
  5. Problème avec des annotations
    Par ploxien dans le forum Langage
    Réponses: 8
    Dernier message: 18/04/2007, 10h45

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