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 d'injection de DAO avec Spring [Web Services]


Sujet :

Spring Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Problème d'injection de DAO avec Spring
    Bonjour,

    Je suis débutant sur le Framework Spring et je fais appel à vous car cela fait quelques jours que je suis bloqué sur ce problème malgré mes recherches sur le web.

    Ce problème apparais dans plusieurs forums techniques, mais je n'ai pas trouvé de solution, ni d'explication claire répondant à mon besoin. (les solutions proposées ne fonctionnant pas pour moi, j'en déduis que soit elle ne correspond pas à mon problème, soit je n'ai rien compris à la configuration de Spring, voir les deux).

    Mon objectif est de faire fonctionner un petit serveur de test pour comprendre le fonctionnement des web services avec les outils Tomcat + Spring + Hibernate + JPA + CXF.

    La partie DAO fonctionne correctement, un test côté serveur avec JUnit passe sans souci.

    voici le code côté serveur :
    ApplicationContext.xml (j'ai intégré la parti accès au données dans ce fichier de conf, mais il est en principe dans un autre fichier)
    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
     
    	<!-- Chargement modules CXF. -->
    	<import resource="classpath:META-INF/cxf/cxf.xml" />
    	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
     
    	<context:component-scan base-package="com.test" />
    	<context:annotation-config />
     
      	<!-- Couches applicatives. -->
        <bean id="paysDao" class="com.test.dao.PaysDao"/>
     
        <bean id="paysWS" class="com.test.ws.PaysWS">
      		<property name="paysDao" ref="paysDao" />
        </bean>
     
      	<!-- Définition du Endpoint JAX-WS.-->
    	<jaxws:endpoint id="paysService" 
    		implementor="com.test.ws.PaysWS" 
    		address="/PaysService">
    	</jaxws:endpoint>
    IPaysWS.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @WebService
    public interface IPaysWS {
     
        @WebMethod
        public String getFrance() throws WebServiceException;
     
        @WebMethod
        public List<Pays> findPaysAll() throws WebServiceException;
     
    }
    PaysWS.java
    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
     
    public class PaysWS implements IPaysWS, Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Autowired
        IPaysDao                  paysDao;
     
        public void setPaysDao( IPaysDao paysDao ) {
            this.paysDao = paysDao;
        }
     
        public String getFrance() {
            return "France";
        }
     
        public List<Pays> findPaysAll() {
            return paysDao.findAll();
        }
     
    }
    IPaysDao.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface IPaysDao {
     
        public List<Pays> findAll();
     
    }
    PaysDao.java
    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
     
    @Transactional
    public class PaysDao implements IPaysDao, Serializable {
     
        private static final long   serialVersionUID = 1L;
     
        private static final String SQL_SELECT       = "from Pays";
     
        @PersistenceContext
        private EntityManager       entityManager;
     
        public void setEntityManager( EntityManager entityManager ) {
            this.entityManager = entityManager;
        }
     
        @SuppressWarnings( "unchecked" )
        public List<Pays> findAll() {
            try {
                return entityManager.createQuery( SQL_SELECT ).getResultList();
            } catch ( Throwable th ) {
                throw new ExceptionJPA( th, 1 );
            }
        }
     
    }
    coté client :
    client-beans.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<jaxws:client id="paysWS" serviceClass="com.test.ws.IPaysWS"
    		address="http://10.101.110.54:8080/TestSpringWebService/PaysService">
    	</jaxws:client>
    client.java
    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
     
        public static void main( String args[] ) throws Exception {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( "client-beans.xml" );
     
            IPaysWS paysService = (IPaysWS) ctx.getBean( "paysWS" );
            if ( paysService != null ) {
     
                System.out.println( paysService.getFrance() );
     
                List<Pays> listPays = new ArrayList<Pays>();
                listPays = paysService.findPaysAll();
     
                for ( Pays pays : listPays ) {
                    System.out.println( pays.getNom() );
                }
            }
        }
    J'utilise les pays par habitude durant mes essais, ça change des beans habituelles, mais là n'est pas le problème.

    Quand je fais appel aux web services avec mon client, la méthode getFrance() me retourne bien "France", en revanche que j'utilise la méthode findPaysAll(), paysDao est à null et Tomcat me renvoi donc un jolie NullPointerException

    j'ai bien trouvé une solution en créant une Factory à la main pour injecter la Dao dans paysWS avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public IPaysDao getPaysDao() {
            return DAOFactory.getInstance().getPaysDao();
        }
    mais cela ne me convient pas, je pense que Spring doit pouvoir le faire.

    Il me semble que j'ai pourtant bien respecté la doc

    j'ai 2 hypothèses :
    - La DAO n'est plus instanciée au moment où je fais appel à elle, pourtant quand je fais le test avec JUnit cela fonctionne.
    - Spring ne fait pas l'injection de paysDao dans paysWS et donc paysWS ne peut pas répondre quand j'attaque la DAO, là ça voudrais dire que je n’ai pas compris comment faire.

    Quelqu'un aurait-il une idée du problème ou un début d'explication ?

    Merci de votre attention.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Bonjour.

    Essayes ce code dans la classe PaysWS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     IPaysDao                  paysDao;
     
        @Autowired
        public void setPaysDao( IPaysDao paysDao ) {
            this.paysDao = paysDao;
        }
    Et avant, il faut déclarer ton service dans l'interface IPaysDao :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Service("paysDao")
    public interface IPaysDao {
     
        public List<Pays> findAll();
     
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Merci de m'avoir proposé une solution. Mais elle ne fonctionne malheureusement pas.

    Mais je viens de trouver la solution au problème (après 4jours dessus ), en relisant calmement les différentes docs que j'ai pu lire et notamment celle-ci.
    Comme quoi à force de relire on finit quand même par trouver.

    voici les changements apportés pour que l'injection fonctionne.

    dans paysWS.java
    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
     
    @WebService(endpointInterface="com.test.ws.IPaysWS")
    public class PaysWS implements IPaysWS, Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Autowired
        private IPaysDao                  paysDao;
     
        public void setPaysDao( IPaysDao paysDao ) {
            this.paysDao = paysDao;
        }
     
        public String getFrance() {
            return "France";
        }
     
        public List<Pays> findPaysAll() {
            return paysDao.findAll();
        }
     
    }
    Tel qu'indiqué dans la doc, on doit re-préciser à quelle interface de WebService il appartient (j'ai aussi mis l'attribut en private).

    et dans ApplicationContext.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<!-- Chargement modules CXF. -->
    	<import resource="classpath:META-INF/cxf/cxf.xml" />
    	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
     
    	<bean id="paysService" class="com.test.ws.PaysWS">
    		<property name="paysDao" ref="paysDao"/>
    	</bean>
     
      	<!-- Définition du Endpoint JAX-WS.-->
    	<jaxws:endpoint id="paysServiceEndpoint" implementor="#paysService" address="/PaysService"/>
    Pour être au plus prêt de mon objectif je déclare la configuration de mes DAO dans le web.xml comme ceux-ci.
    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
     
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    			WEB-INF/ApplicationContext.xml
    			classpath:/spring-config-dao.xml
    		</param-value>
    	</context-param>
     
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
     
    	<servlet>
    		<servlet-name>CXFServlet</servlet-name>
    		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
     
    	<servlet-mapping>
    		<servlet-name>CXFServlet</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
    Sinon rien à changé.

    Voilà encore merci d'avoir répondu.

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

Discussions similaires

  1. Problème à l'étape d'intégration avec Spring
    Par denzelboy dans le forum Tapestry
    Réponses: 1
    Dernier message: 04/12/2009, 20h51
  2. [DisplayTag] Problème de selection multiple checkbox avec spring mvc
    Par nean_j dans le forum Taglibs
    Réponses: 5
    Dernier message: 20/11/2009, 14h33
  3. [Data] Problème test Dao avec Spring et iBatis
    Par fiatlux dans le forum Spring
    Réponses: 3
    Dernier message: 23/12/2007, 09h55

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