Annuaire JNDI

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 :

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");

Accéder à l'annuaire

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);
}

Rechercher une entrée JNDI

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.

jnditest.jsp

Exemple de résultat : http://www.mycgiserver.com/~mguessan/jnditest.jsp