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

Wildfly/JBoss Java Discussion :

[Datasource] [JNDI] Problème de nommage


Sujet :

Wildfly/JBoss Java

  1. #1
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut [Datasource] [JNDI] Problème de nommage
    Bonjour tout le monde,

    Mon problème du jour est le suivant : j'essaye d'installer une application (bedework, moteur de calendrier) sur un JBoss, alors que par défaut elle tourne sur un tomcat. Quand je dis "par défaut" c'est que dans la doc ils disent :

    To use a new database, you will have to change the DataSource
    information. Where this is specified varies among servlet containers. In Tomcat,
    this
    is in the server.xml file
    En effet, on définit la datasource dans le server.xml et ensuite il fait le lien comme un grand :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <DefaultContext>
                 <Resource name="jdbc/calDB" auth="Container"
                           type="javax.sql.DataSource"/>
                 <ResourceParams name="jdbc/calDB">
       ...
       paramètres...
       ...
     
       </DefaultContext>
    Alors c'est cool, ça marche pour un tomcat MAIS pour un JBoss je n'arrive pas à le faire marcher, pourtant : je crée un fichier de datasource qui contient ça :

    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
    <datasources>
         <local-tx-datasource>
           <!-- le nom de l'objet qui sera récupéré par les applications -->
           <jndi-name>calDB</jndi-name>
           <!-- url d'accès à la base de données -->
           <connection-url>jdbc:mysql://localhost/calDB</connection-url>
           <!-- classe du driver utilisé. Cette librairie doit être située
       dans le répertoire lib du serveur d'application -->
           <driver-class>com.mysql.jdbc.Driver</driver-class>
            <!-- nom d'utilisateur et mot de passe d'accès -->
           <user-name>calroot</user-name>
           <password>calroot</password>
     
         </local-tx-datasource>
       </datasources>
    Au chargement de JBoss, pas de pb, ma datasource est chargée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       15:46:45,240 INFO  [ConnectionFactoryBindingService] Bound
       ConnectionManager 'jboss.jca:name=calDB,service=DataSourceBinding'
       to JNDI name 'java:calDB'
    Sauf que les références à cette datasource sont faites en utilisant jdbc/calDB et non pas java:calDB. Ce qui est sûr c'est qu'au déploiement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (javax.naming.NamingException: resource-ref: jdbc/calDB has no valid
       JNDI binding. Check the jboss-web/resource-ref.)
    Du coup j'ai ouvert le fichier cité et j'y lis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       <resource-ref>
           <res-ref-name>jdbc/calDB</res-ref-name>
           <res-type>javax.sql.DataSource</res-type>
           <jndi-name>java:/CalendarDS</jndi-name>
       </resource-ref>
    J'avais jamais vu ce genre de choses, mais je me dis : y'a un nom JNDI, je vais tenter d'appeler ma datasource comme ça, donc je modifie mon fichier de datasource en précisant : <jndi-name>/CalendarDS</jndi-name>, mais ça marche toujours pas.

    Du coup ma question c'est : comment faut il que je nomme ma datasource pour que l'appli fasse le rapprochement ? A priori c'est faisable sans toucher aux sources et aux jboss-web.xml, mais je m'y perds entre les noms jndi, les resource names, et autres machins.

    Merci d'avance !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par legzo
    J'avais jamais vu ce genre de choses, mais je me dis : y'a un nom JNDI, je vais tenter d'appeler ma datasource comme ça, donc je modifie mon fichier de datasource en précisant : <jndi-name>/CalendarDS</jndi-name>, mais ça marche toujours pas.
    Merci d'avance !
    Essaie sans le slash

  3. #3
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par the-gtm
    Essaie sans le slash
    Je viens de tester, mais le résultat est le même malheureusement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [ConnectionFactoryBindingService] Bound ConnectionManager
     'jboss.jca:name=CalendarDS,service=DataSourceBinding'
     to JNDI name 'java:CalendarDS'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceController] Problem starting service jboss.web.deployment:id=1161224830,war=cal.war
     
    org.jboss.deployment.DeploymentException: Error during deploy;
     - nested throwable: (javax.naming.NamingException:
     resource-ref: jdbc/calDB has no valid JNDI binding. 
    Check the jboss-web/resource-ref.)
    Je suis en train de parcourir tous les forums anglophones pour essayer de comprendre comment faire le lien entre ces différents noms, mais c'est pas gagné.

    Merci d'avance à ceux qui ont une idée !

    EDIT: il semblerait en fait que ce soit ça ! C'est juste que 'javais mal testé la deuxième fois. Merci bien.

  4. #4
    Futur Membre du Club
    Inscrit en
    octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Salut,
    je ne connais pas trop JBOSS, mais je sais que les DataSources doivent se trouver dans le repertoire "Deploy"
    voici un exple de dataSource qui fonctionne chez moi :

    <datasources>
    - <local-tx-datasource>
    <jndi-name>nom_connexion</jndi-name>
    <connection-url>jdbc:oracle:thin:@myHost:myDataBaseName</connection-url>
    <driver-class>oracle.jdbc.OracleDriver</driver-class>
    <user-name>userName</user-name>
    <password>password</password>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    </local-tx-datasource>
    myHost : nom du poste avec le port;
    myDatabaseName : nom de la base de données.
    Cdt,

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    août 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2005
    Messages : 73
    Points : 56
    Points
    56
    Par défaut
    J'ai exactement le même problème...

    La datasource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <datasources>
      <local-tx-datasource>
        <jndi-name>myfridgeds</jndi-name>
        <connection-url>jdbc:mysql://localhost:3306/myfridge</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <user-name>myfridge</user-name>
        <password>myfridge</password>    
        <metadata>
           <type-mapping>mySQL</type-mapping>
        </metadata>
      </local-tx-datasource>
    </datasources>
    Au lancement de JBoss, il trouve bien la datasource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    19:28:43,750 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
    19:28:43,906 INFO  [WrapperDataSourceService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=myfridgeds' to JNDI name 'java:myfridgeds'
    Mon test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Hashtable<String, String> ht  = new Hashtable<String, String>();
    		ht.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    		ht.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    		ht.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); 
     
    		InitialContext context = new  InitialContext(ht);
     
            DataSource dataSource = (DataSource)context.lookup("myfridgeds");
    L'erreur ...
    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
    Exception in thread "main" javax.naming.NameNotFoundException: myfridgeds not bound
    	at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
    	at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
    	at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
    	at org.jnp.server.NamingServer.lookup(NamingServer.java:296)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
    	at sun.rmi.transport.Transport$1.run(Transport.java:153)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
    	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    	at java.lang.Thread.run(Thread.java:595)
    	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
    	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
    	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
    	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
    	at javax.naming.InitialContext.lookup(Unknown Source)
    	at test.MainTestClass.<init>(MainTestClass.java:25)
    	at test.MainTestClass.main(MainTestClass.java:37)
    Je comprends pas trop... J'ai également essayé de jouer sur le slash... Mais je vois pas ce qui cloche

  6. #6
    Membre éclairé Avatar de XmasRock
    Inscrit en
    janvier 2007
    Messages
    729
    Détails du profil
    Informations forums :
    Inscription : janvier 2007
    Messages : 729
    Points : 821
    Points
    821
    Par défaut
    Citation Envoyé par legzo

    Alors c'est cool, ça marche pour un tomcat MAIS pour un JBoss je n'arrive pas à le faire marcher, pourtant : je crée un fichier de datasource qui contient ça :

    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
    <datasources>
         <local-tx-datasource>
           <!-- le nom de l'objet qui sera récupéré par les applications -->
           <jndi-name>calDB</jndi-name>
           <!-- url d'accès à la base de données -->
           <connection-url>jdbc:mysql://localhost/calDB</connection-url>
           <!-- classe du driver utilisé. Cette librairie doit être située
       dans le répertoire lib du serveur d'application -->
           <driver-class>com.mysql.jdbc.Driver</driver-class>
            <!-- nom d'utilisateur et mot de passe d'accès -->
           <user-name>calroot</user-name>
           <password>calroot</password>
     
         </local-tx-datasource>
       </datasources>

    ajoutes un fichier WEB-INF/jboss-web.xml avec ça dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <jboss-web>
        <resource-ref>
            <res-ref-name>jdbc/TheDataSource</res-ref-name>
            <jndi-name>java:/DefaultDS</jndi-name>
        </resource-ref>
    </jboss-web>
    C'est dans ce fichier que tu fais la liaison entre le nom logique utilisé dans l'appli et le nom JNDI que tu déclare lorsque tu configures ta datasource.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/06/2008, 16h42
  2. Utilisation d'une Datasource JNDI
    Par meurwinn dans le forum BIRT
    Réponses: 5
    Dernier message: 03/06/2008, 12h09
  3. Comment utiliser une datasource JNDI avec JDBC?
    Par KING_OF_GRACELAND dans le forum JDBC
    Réponses: 6
    Dernier message: 08/04/2008, 18h18
  4. [EJB]JBoss et JNDI, problème pour trouver mes EJB
    Par shingo dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 31/12/2005, 15h14
  5. [JNDI] Problème en cas de perte de connexion
    Par Marc_P dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 19/10/2004, 14h45

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