L'annuaire JNDI est devenu un composant central des serveurs d'application J2EE. Il sert de référentiel de configuration aux applications et au serveur d'applications lui même.
Mais l'interface JNDI ne s'arrête pas là : c'est aussi une interface générique vers tout type d'annuaire, qu'il soit LDAP ou basé sur de simples fichiers, qu'il soit local à la machine virtuelle Java ou accédé à distance, qu'il contienne des noms de personnes ou des définitions de files de messages.
Chacun de ces types d'annuaires disposent de leur propres mécanismes d'alimentation et d'administration, mais il est parfois difficile d'avoir une vue précise sur leur contenu réel.
Cette rubrique a pour objectif de présenter les bases de l'interface JNDI ainsi qu'une page Jsp permettant de visualiser le contenu d'un annuaire JNDI
Initialisation du contexte JNDI
La première étape pour accéder à un annuaire JNDI consiste
à instancier un objet contexte. Utiliser le constructeur
sans paramètres de la classe
javax.naming.InitialContext
permet d'accéder au contexte par défaut du serveur
d'applications :
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
Il existe deux manières d'accéder à un autre annuaire :
Changer les propriétés systèmes
Deux propriétés sont prises en compte lors de la création d'un contexte JNDI :
-
java.naming.factory.initial
: Indique la classe java du fournisseur JNDI, il s'agit de :-
org.apache.naming.java.javaURLContextFactory
dans Tomcat, -
com.sun.jndi.ldap.LdapCtxFactory
pour un annuaire LDAP, -
com.ibm.websphere.naming.WsnInitialContextFactory
dans Websphere 4, -
com.ibm.ejs.ns.jndi.CNInitialContextFactory
dans Websphere 3.5.
-
-
java.naming.provider.url
: adresse de l'annuaire, cette propriété est nulle dans le cas des annuaires locaux, et contient sinon l'URL de l'annuaire (protocole, chemin). Par exemple :-
ldap://srvwebsphere/dc=guessant,dc=org
pour un annuaire LDAP, -
iiop://localhost/
pour Websphere.
-
Pour les positionner au démarrage de l'application,
il faut utiliser le paramètre -D
:
java \ -Djava.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory \ -Djava.naming.provider.url=ldap://localhost
Fournir une table de paramètres
S'il n'est pas possible de modifier les paramètres par défaut de la machine virtuelle (cas de l'accès à un annuaire externe à l'intérieur d'un serveur d'applications), il faut construire une table contenant les valeurs des paramètres JNDI :
java.util.Hashtable env = new java.util.Hashtable(); env.put( javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put( javax.naming.Context.PROVIDER_URL, "ldap://localhost");
Lister les entrées d'un contexte
La méthode listBindings()
permet de lister les
entrées JNDI d'un contexte. Elle retourne une
NamingEnumeration
d'objets Binding
.
NamingEnumeration enum = ctx.listBindings(name); while (enum.hasMoreElements()) { Binding currentElement = (Binding)enum.next(); Object currentObject = currentElement.getObject(); System.out.print(currentElement.getName()); System.out.print(" : "); System.out.println(currentObject); }
La méthode lookup()
permet de rechercher une
entrée dans l'annuaire JNDI.
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/masource");
Afficher récursivement le contenu de l'annuaire
La page jsp suivante permet d'afficher le contenu complet de l'annuaire JNDI d'un serveur d'applications. Pour l'utiliser, il suffit de la recopier dans l'arborescence web d'une application web installée.
Exemple de résultat : http://www.mycgiserver.com/~mguessan/jnditest.jsp