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 :

Autowired ne fonctionne que dans ma classe de tests unitaires [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 72
    Par défaut Autowired ne fonctionne que dans ma classe de tests unitaires
    Bonjour à tous,

    J'ai bien consulté les sujets concernant mon problème et je n'ai pas réussi à trouver la réponse, c'est pourquoi je me permet d'énoncer mon soucis.

    En effet l'annotation @Autowired dans mon cas ne fonctionne que quand elle est déclarée dans ma classe de test unitaire, je m'explique.

    Voici mes classes pseudo metier

    Une classe de test qui devrait provoquer une injection :
    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
    24
    package fr.npa.annuaire.domain;
     
    import org.springframework.beans.factory.annotation.Autowired;
     
    public class MaClasseAutowired {
     
    	@Autowired
    	private Toto toto;
     
    	public Toto getToto() {
     
    		return toto;
    	}
     
    	public void setToto(Toto toto) {
     
    		this.toto = toto;
    	}
     
    	public MaClasseAutowired(){
     
    		System.out.println("####  Constructeur MaClasseAutowired");
    	}
    }
    La classe Toto qui est marquée comme Component :
    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
    package fr.npa.annuaire.domain;
     
    import org.springframework.stereotype.Component;
     
     
    @Component
    public class Toto {
     
    	//@Autowired
    	//CrudRepository<Personne, Integer> repoTOTO;
     
    	public Toto(){
     
    		System.out.println("#### CONSTRUCTEUR TOTO");
    	}
    }
    Voici ma classe de test unitaire :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package fr.npa.annuaire.siteWeb.actions;
     
    import static org.junit.Assert.assertNotNull;
     
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     
    import fr.npa.annuaire.domain.MaClasseAutowired;
    import fr.npa.annuaire.domain.Toto;
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/applicationContext.xml" })
    public class AutowiredTest {
     
    	@Autowired
    	private Toto totoTest;
     
    	@Test
    	public void testAutowire(){
     
    		assertNotNull("totoTest null", totoTest);
     
                    //la ca passe, l'autowired a bien fonctionne
    		MaClasseAutowired tmp = new MaClasseAutowired();
     
                    //et la ca casse
    		assertNotNull("toto est null", tmp.getToto());
    	}
    }
    Lors de l’exécution l'attribut totoTest a bien été instancié par injection mais le deuxième assert ne passe pas car l'autowired ne s'est pas fait dans MaClasseAutowired.

    Voici mes fichiers de configurations

    web.xml
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="struts_blank" version="2.4"
    	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    	<display-name>Struts Blank Convention</display-name>
     
     
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
     
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/applicationContext.xml</param-value>
    	</context-param>
     
    	<filter>
    		<filter-name>struts2</filter-name>
    		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    		<init-param>
    			<param-name>struts.devMode</param-name>
    			<param-value>true</param-value>
    		</init-param>
    <!-- 		<init-param>
    			<param-name>struts.objectFactory</param-name>
    			<param-value>org.apache.struts2.spring.StrutsSpringObjectFactory</param-value>
    		</init-param> -->
    	</filter>
     
    	<filter-mapping>
    		<filter-name>struts2</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
     
    	<!-- <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> -->
    </web-app>
    Le fichier applicationContext.xml contient entre autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <bean 
    class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
    	<context:component-scan base-package="fr.npa.annuaire"/>

    Je cherche depuis ce matin a résoudre ce drôle de problème, je pense que l'erreur va vous sauter aux yeux :p

    En vous remerciant!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 72
    Par défaut [Data JPA]Autowired sur une interface de repository type "extends JPARepository<>" ne fonctionne pas
    Ça a une rapport avec le fait que le repository déclarée de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface PersonneRepository extends JpaRepository<Personne, Integer>{
     
    }
    Génère un proxy puisqu'il ne s'agit pas d'une implémentation.

    Le runner de la classe de test semble quant à lui bien gérer l'autowired sur une interface sans implémentation.

    Runner déclaré dans l'annotation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @RunWith(SpringJUnit4ClassRunner.class)
    Pourtant les fichiers de configurations sont les mêmes.

    Avez vous dans votre code un autowired qui fonctionne sur un repository déclaré comme le mien?



    Merci!

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 72
    Par défaut
    Désolé je passe du coq à l'âne, mon problème initial était avec un repository, voici le contexte de mon problème mis à jour.

    Mon "Repository" n'a pas d’implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package fr.npa.annuaire.repository;
     
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
     
    import fr.npa.annuaire.domain.Personne;
     
    @Repository
    public interface PersonneRepository extends JpaRepository<Personne, Integer>{
     
    }
    Un service qui utilise ce repo :
    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
    package fr.npa.annuaire.services;
     
    import javax.annotation.Resource;
     
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service;
     
    import fr.npa.annuaire.repository.PersonneRepository;
     
    @Service
    public class PersonneServiceImpl implements PersonneService {
     
    	@Resource
    	private PersonneRepository repo;
     
     
    }
    Avec l'interface qui pour l'instant ne définit rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package fr.npa.annuaire.services;
     
     
    public interface PersonneService {
     
    }
    Le bean de ce service n'arrive pas a se créer et voici l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personneServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [fr.npa.annuaire.repository.PersonneRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER)}

    Alors que pourtant ma classe de test unitaire qui fait un autowire du même repository fonctionne parfaitement et retourne le résultat attendu :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package fr.npa.annuaire.siteWeb.actions;
     
    import static org.junit.Assert.*;
    import junit.framework.Assert;
     
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     
    import fr.npa.annuaire.domain.Personne;
    import fr.npa.annuaire.repository.PersonneRepository;
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml" })
    public class CreerPersonnelActionTest {
     
     
    	@Autowired
    	PersonneRepository repo;
     
    	@Test
    	public void test() {
    		assertNotNull(repo);
     
    		Personne moi = new Personne();
     
    		moi.setNom("Mon Nom");
    		moi.setPrenom("Mon Prenom");
     
    		Assert.assertEquals(0, repo.count());
     
    		repo.save(moi);
     
    		Assert.assertEquals(1, repo.count());
    	}
     
     
    }
    Avez vous un exemple utilisant Spring-data-jpa qui fonctionne en dehors des TU?

    Aussi je m'excuse pour le changement brusque de contexte dans mon thread.

    Merci!

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonsoir,

    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [fr.npa.annuaire.repository.PersonneRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
    Tu n'as pas de classe qui implémente l'interface PersonneRepository.

    A+.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 72
    Par défaut
    Problème dû en réalité a un problème de configuration résolu dans :
    http://www.developpez.net/forums/d13...n/#post7095654

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tétraèdrisation ne fonctionne que dans certains cas
    Par Rafy dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/12/2008, 20h51
  2. [JUnit] JUnit que faut il mettre dans la classe de test
    Par maysam dans le forum Tests et Performance
    Réponses: 9
    Dernier message: 06/11/2008, 13h20
  3. Effet fondu ne fonctionne que dans un sens
    Par Gaspoute dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/01/2008, 10h24
  4. [MySQL] Condition ne fonctionnant pas dans une classe
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/02/2007, 16h38
  5. [XP] Bureau à distance ne fonctionne que dans un sens
    Par beegees dans le forum Windows XP
    Réponses: 5
    Dernier message: 09/07/2006, 09h49

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