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 :

Remplacer Singleton de connexion à la bdd [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de chewing-gum
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 105
    Par défaut Remplacer Singleton de connexion à la bdd
    Bonjour,

    j'ai un devoir qui consiste, entre autres, à passer d'un singleton basique (connexion JDBC) à l'utilisation de Spring.
    En bref, je dois virer le singleton de mon projet et utiliser l'injection de dépendances.
    Mais j'ai quelques problèmes pour le faire...

    Actuellement, j'ai un singleton qui instancie un objet de type Connection :
    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
     
    public class ConnectionManager
    {
            private Connection connect;
     	private static final Logger log = LoggerFactory.getLogger(ConnectionManager.class);
     
    	public static Connection getInstance()
    	{
    		if (connect == null) {
    			try {
    				connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/projetspring", "root", "password");
    			}
    			catch (SQLException e) {
    				log.debug("Connection failed ! ", e);
    			}
    		}
     
    		return connect;
    	}
    }
    Pour réaliser mon travail et remplacer ce fameux singleton, j'ai donc essayé avec Spring ceci dans mon applicationContext.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<bean id="propertyConfigurer"
    		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    		<property name="location" value="classpath:database.properties" />
    	</bean>
     
    	<bean id="dataSource"
    		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driverClassName}" />
    		<property name="url" value="${jdbc.url}" />
    		<property name="username" value="${jdbc.username}" />
    		<property name="password" value="${jdbc.password}" />
    	</bean>
    Mon database.properties:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/projetspring
    jdbc.username=root
    jdbc.password=password
    Mais là, je tombe sur un problème. Premièrement, mon code dans Spring instancie un objet de type "DriverManagerDataSource". Or, j'aimerai obtenir un objet de type Connection !

    Du coup, j'ai tenté dans mon DAO :
    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
    public class UserDao {
    	private final static Logger log = LoggerFactory.getLogger(MediaDao.class);
    	@Resource DriverManagerDataSource dataSource;
    	Connection conn;
    	
    	public UserDao()
    	{
    		try {
    			this.conn = this.dataSource.getConnection();
    		}
    		catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Mais ça ne fonctionne pas. L'objet retourné est NULL.
    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
     
     
    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [fr.gesa.opr.user.dao.UserDao]: Constructor threw exception; nested exception is java.lang.NullPointerException
    	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
    	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)
    	... 43 more
    Caused by: java.lang.NullPointerException
    	at fr.gesa.opr.user.dao.UserDao.<init>(UserDao.java:35)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    	... 45 more

    Ma question est donc la suivante : Comment puis-je récupérer un objet de type Connection avec Spring afin de l'injecter dans ma classe DAO ?

    Je vous remercie

  2. #2
    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
    C'est ton datasource qui est null. Il est null parce que spring ne l'a pas encore injecté. Spring ne l'a pas encore injecté parce qu'il est seulement à l'étape de construction de ton objet.

    Tu ne dois utiliser dans ton constructeur aucun champ injecté par spring

  3. #3
    Membre éprouvé Avatar de chewing-gum
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 105
    Par défaut
    Merci pour la réponse rapide.

    Dans ce cas là, je ne vois pas où je pourrais récupérer mon objet de type Connection si ce n'est pas dans le constructeur.
    Soit je le fais au début de chaque méthode que j'utilise dans mon DAO (c'est répétitif), soit je trouve une autre solution.
    Et à vrai dire, je n'ai pas d'idées car je débute avec Spring.

    Auriez-vous une idée pour que je puisse injecter simplement mon objet Connection ? Ou même un lien vers une doc qui ressemble à peu près à ce que je veux faire ?

    Je vous remercie

  4. #4
    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
    A priori, c'est à chaque appel au DAO qu'on effectue une demande de connexion au datasource, ça permet de gérer correctement le multi tâches et ça évite aussi de maintenir trop longtemps un connexion.

    Au delà de ça, pour votre initialisation, vous avez deux possibilités pratiques:

    Soit créer une méthode "init" (ou autre nom) dans votre dao qui fait ce travail et demander à spring d'appeler cette méthode (paramètre init-method du tag <bean>)

    Soit passer en paramètre au constructeur les objets dont vous avez besoin dans le constructeur (<contructor-arg> dans le fichier spring)

  5. #5
    Membre éprouvé Avatar de chewing-gum
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 105
    Par défaut
    Encore merci pour cette réponse.

    J'ai finalement réussi ce que je voulais grâce à votre aide.
    J'ai ajouté une méthode init() à ma classe DAO. Puis, j'ai appelé avec spring cette méthode comme vous me l'avez indiqué (et en regardant la doc pour la syntaxe) pour modifier ma variable de connexion.

    Résolu

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

Discussions similaires

  1. [ODBC] connexion à differentes BDD avec php et ODBC
    Par tigunn dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/12/2009, 12h17
  2. [VB+MySql]Une seule connexion à ma Bdd...
    Par Deejoh dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 28/01/2006, 11h08
  3. connexion à une bdd mysql en asp
    Par asetti dans le forum ASP
    Réponses: 3
    Dernier message: 31/10/2005, 18h31
  4. [Applet][MySQL] connexion à une BDD
    Par Michel38 dans le forum JDBC
    Réponses: 19
    Dernier message: 20/07/2005, 14h59
  5. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22

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