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 :

component-scan ne semble pas scanner mes composants


Sujet :

Spring Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 109
    Points : 71
    Points
    71
    Par défaut component-scan ne semble pas scanner mes composants
    Bonjour à tous,

    Je vous sollicite car je suis sur un problème de paramétrage Spring depuis 2 jours et je n'arrive pas à trouver ce qui ne vas pas :
    J'ai un tout petit projet JEE avec spring 3.2.17. Pour cette appli j'ai donc créé dans mon arbo le fichier suivant WEB-INF/spring/applicationContext.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
     
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
                http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd            
                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd">
     
    	<!-- ANNOTATIONS POUR LA CREATION DE BEANS -->
    	<context:component-scan base-package="com.appli.fourniture" />       
    </beans>
    Ensuite dans mon web.xml j'ai ajouté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <context-param>   
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:WEB-INF/spring/applicationContext.xml</param-value>
     </context-param>   
       <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    J'ai ensuite tout bonnement créer un WebService qui utilise une classe ayant l'entête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Service("alimentationService")
    public class AlimentationsServiceImpl implements AlimentationService {

    Mon WebService a une entête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @WebService(name = "Alimentation", serviceName = "WS")
    public class AlimentationWebServiceImpl implements AlimentationWebService {
     
        @Autowired
        private AlimenationService alimentationsService;

    Mon problème c'est que lorsque j'essaie d'utiliser la propriété "alimentationsService" j'ai un null pointer exeception.

    J'ai donc plusieurs questions :
    1 - Comment puis-je m'assurer que mon fichier applicationContext.xml est bien pris en compte ?
    2- Comme je pensais que le fichier n'était pas pris en compte j'ai fait un petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:WEB-INF/spring/applicationContext.xml");
            String test = context.getApplicationName();
            System.out.println("Nb : " + context.getBeanDefinitionCount());
            System.out.println("Nb : " + context.getBeansOfType(Converter.class).toString());
    J'ai remarqué qu'avec ce bout de code je charge bien mon fichier (car si je donne un nom bidon j'ai un FileNotExist) par contre je n'ai aucun élément scanné.

    Qu'ai-je raté ? Avez vous une idée ?


    Merci beaucoup !

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Le package est bien le même (question bête je sais...)?

    Sinon, pourquoi tu références directement le nom de ton service? Si tu fais de l'injection avec @Autowired/@Inject, en référençant l'interface du service, le reste est automatique normalement (pas besoin de référencer les beans par leur nom)...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    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
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Parce que AlimentationWebServiceImpl n'est pas un bean Spring donc il n'injecte pas AlimenationService.
    Utilise SpringBeanAutowiringSupport:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @PostConstruct
    public void postConstruct() {
      SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    A+.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 109
    Points : 71
    Points
    71
    Par défaut
    Merci @Pill_S, c'est vrai que je n'ai pas précisé mais ma classe WS se situe dans com.appli.fourniture.alimentation.webservices et l'autre dans com.appli.fourniture.alimentation.service.
    Pour la redondance c'est un vestige de mes tests (le test du désespoir )

    @andry.aime, merci également, si je comprends bien postConstruct va être appelé juste après l'initialisation du bean et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    Va me permettre de "forcer" la lecture du contexte mis dans le fichier applicationContext défini dans mon web.xml ?

    J'ai essayé (copié / collé ) de la méthode avec une petite trace. Il rentre bien dans mon postConstruct mais cela ne charge toujours pas. Du coup j'ai fait une petit modification en ajoutant l'annotation @ContextConfiguration("spring/applicationContext.xml") pour ma classe mais rien n'y fait.

  5. #5
    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
    Points : 15 059
    Points
    15 059
    Par défaut
    Pour ton web.xml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>

    A+.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    Comme l'a dit chleu, un service web n'est pas sauf dans le cas très particulier de CXF un bean géré par Spring.
    L'annotation autowired ne fonctionne que dans le cas des beans gérés par spring.
    Pour étendre la possibilité d'utilisation de l'autowiring à d'autre classe Java, Spring a prévu deux possibilités :
    • l'héritage : il suffit d'hériter de la classe SpringBeanAutowiringSupport
    • appeler la méthode SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext indiquée par chleu lors de la phase d'initialisation de la classe (dans un SW le postcontruct)


    la documentation Spring semble préférée la première solution (héritage) pour un service web.

    Dans notre cas, nous avons utilisé la solution du PostConstruct pour un SW hébergé par Websphere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       @PostConstruct
        public void postConstruct() {
             SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }

Discussions similaires

  1. Ne pas répetter mes composants
    Par Antjac dans le forum Rave
    Réponses: 6
    Dernier message: 16/03/2009, 11h06
  2. Mes composants ne s'affichent pas
    Par michel71 dans le forum Débuter
    Réponses: 2
    Dernier message: 05/08/2007, 17h01
  3. Je ne trouve pas TabSheet dans mes composants.
    Par heider dans le forum EDI
    Réponses: 7
    Dernier message: 20/01/2006, 22h59
  4. Réponses: 6
    Dernier message: 13/02/2005, 00h40
  5. Réponses: 1
    Dernier message: 23/06/2002, 00h15

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