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

Java EE Discussion :

enregister le SessionFactory dans le JNDI [JNDI]


Sujet :

Java EE

  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Points : 900
    Points
    900
    Par défaut enregister le SessionFactory dans le JNDI
    Bonjour à tous



    ******************** Version courte ***************


    Question surement très simple: j'utilise un SessionFactory founit par Spring dans le contexte d'un test CRUD jsf/spring/hibernate, et je voudrais savoir comment faire pour l'enregistrer dans le JNDI afin de pouvoir faire des lookup dessus depuis la couche dao

    Merci d'avance de vos réponses



    ******************** Version longue ***************

    J'ai utilisé hibernate tools pour générer mes classes de DAO et mes entités à partir de ma base de données (conséquente). Chaque classe de dao générée commence par le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private final SessionFactory sessionFactory = getSessionFactory();
     
        protected SessionFactory getSessionFactory() {
            try {
                return (SessionFactory) new InitialContext()
                        .lookup("SessionFactory");
            } catch (Exception e) {
                log.error("Could not locate SessionFactory in JNDI", e);
                throw new IllegalStateException(
                        "Could not locate SessionFactory in JNDI");
            }
        }
    Je le précise, car comme je tourne en local, je n'aurai pas forcément besoin du JNDI sinon (et je trouve un petit peu con qu'il y ait un new Initial context à chaque requête). Mais je ne vais pas commencer à modifier 150 classes, et de plus ce procédé m'évite d'avoir un objet session qui se balade entre les couches.

    Bref, dans mon application contexte j'ai entre autre ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    J'ai essayé d'y adjoindre une propriété telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            <property name="jndiName" value="SessionFactory" />
    Mais je reçois l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.beans.NotWritablePropertyException: Invalid property 'jndiName' of bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Bean property 'jndiName' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    En l'absence de cet ajout hasardeux, nous avons le classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Could not locate SessionFactory in JNDI javax.naming.NameNotFoundException: SessionFactory not bound
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Points : 900
    Points
    900
    Par défaut
    J'ai trouvé la solution. L'essence du truc est de bien comprendre le fonctionnement de spring. La question est : comment ma DAO accède-t-elle à l'objet sessionFactory qui est défini ailleurs?

    D'emblée, le programmeur débutant n'envisage que deux solutions:
    • soit on crée un objet sessionFactory dans les couches hautes, et on le passe en argument aux méthodes des couches inférieures, ce qui détruit complètement la souplesse apportée par Spring
    • soit on enregistre cet objet dans le registre JNDI, et ensuite depuis la couche de dao, on fait des requêtes dans le JNDI pour le récupérer.


    Mais en fait il y a une autre possibilité, la bonne, qui est de paramètrer Spring pour qu'il injecte notre SessionFactory dans la classe de DAO.

    Concrètement, effacer le bloc suivant dans la dao:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private final SessionFactory sessionFactory = getSessionFactory();
     
        protected SessionFactory getSessionFactory() {
            try {
                return (SessionFactory) new InitialContext()
                        .lookup("SessionFactory");
            } catch (Exception e) {
                log.error("Could not locate SessionFactory in JNDI", e);
                throw new IllegalStateException(
                        "Could not locate SessionFactory in JNDI");
            }
        }
    on le remplace par le bloc suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private SessionFactory sessionFactory;
     
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    Ensuite on va dans l'application contexte et on y place le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <bean id="myDao" class="mypackage.MyDao">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>
    Ce qui suppose bien entendu qu'on a défini quelque part un bean sessionFactory avec par exemple tous les mappings hibernate à l'intérieur. Ceci fait, Spring saura que lorsqu'un appel est fait sur la classe de dao, il faut utiliser son setter pour lui injecter la classe SessionFactory, et plus besoin de JNDI

    source
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [ODBC] Enregister panier PHP dans BDD
    Par ju0123456789 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/10/2008, 17h49
  2. Réponses: 32
    Dernier message: 11/09/2008, 09h20
  3. WAS 6 : déclaration d'une ressource dans le JNDI
    Par elewandowski dans le forum Websphere
    Réponses: 6
    Dernier message: 11/12/2007, 17h43
  4. Réponses: 2
    Dernier message: 04/07/2007, 19h18
  5. [EJB3] Deploiement ... rien dans le JNDI View de JBoss...
    Par yakamax dans le forum Java EE
    Réponses: 6
    Dernier message: 26/05/2006, 15h58

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