web-dev-qa-db-fra.com

Code pour lister toutes les entrées de jndi sur une machine distante

Quelqu'un peut-il me dire ou m'indiquer un code pour lister toutes les entrées jndi d'une machine distante

44
Anand Sunderraman

Il est possible de lister toutes les entrées d'un InitialContext. Vous pouvez utiliser cet extrait:

InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("");
while (list.hasMore()) {
  System.out.println(list.next().getName());
}

Si vous utilisez un serveur d'applications, vous avez généralement la possibilité de parcourir l'arborescence JNDI. 

76
Steve

Je sais qu'il reste beaucoup de temps depuis la dernière réponse, mais je devais répertorier toutes les sources de données jdbc disponibles dans un contexte (contexte tomee).

Dans mon cas, il me fallait plus que list("") (malheureusement, cela ne fonctionnait pas pour moi) pour atteindre mon objectif . 

Environnement de nommage pour les composants d'application J2EE

Ayant cela, j'ai obtenu toutes les ressources jdbc disponibles en utilisant l'extrait de code suivant

InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("Java:comp/env/jdbc");
while (list.hasMore()) {
    System.out.println(list.next().getName());
}

C'est tout.

J'espère que cela peut aider quelqu'un d'autre, tout comme moi.

20
Vielinko

Les réponses précédentes ne me donnant pas une "image complète" (sur Tomcat7), j'ai donc rassemblé la fusion suivante, qui convertit les valeurs JNDI en une arborescence (avec des valeurs toString):

import javax.naming.*;
...

public static Map toMap(Context ctx) throws NamingException {
    String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : "";
    HashMap<String, Object> map = new HashMap<String, Object>();
    log.info("> Listing namespace: " + namespace);
    NamingEnumeration<NameClassPair> list = ctx.list(namespace);
    while (list.hasMoreElements()) {
        NameClassPair next = list.next();
        String name = next.getName();
        String jndiPath = namespace + name;
        Object lookup;
        try {
            log.info("> Looking up name: " + jndiPath);
            Object tmp = ctx.lookup(jndiPath);
            if (tmp instanceof Context) {
                lookup = toMap((Context) tmp);
            } else {
                lookup = tmp.toString();
            }
        } catch (Throwable t) {
            lookup = t.getMessage();
        }
        map.put(name, lookup);

    }
    return map;
}

Utilisation:

toMap(new InitialContext());

Donne la sortie suivante dans Tomcat7:

{
  "comp": {
    "env": {
      "myCustomVar": "foobar"
    },
    "UserTransaction": "Cannot create resource instance",
    "Resources": {
      "index.html": "org.Apache.naming.resources.FileDirContext$FileResource@32edeea8",
      "WEB-INF": {
        "ibm-web-ext.xml": "org.Apache.naming.resources.FileDirContext$FileResource@6132b73b",
        "ibm-web-bnd.xml": "org.Apache.naming.resources.FileDirContext$FileResource@22cf71b7"
      }
    }
  }
}
19
Nick Grealy

J'utilise le code suivant (pas pour la production):

public void discoverJndi(String path, Context context) throws TestClientException, NamingException {
    try {
        NamingEnumeration<NameClassPair> list = context.list(path);
        while (list.hasMore()) {
            String name = list.next().getName();
            String child = path.equals("") ? name : path + "/" + name;
            System.out.println(child);
            discoverJndi(child, context);
        }
    } catch (NotContextException e) {}
}
0
Alexey