Domanda Codice per elencare tutte le voci in jndi sulla macchina remota


Qualcuno può dirmi o indicarmi un codice per elencare tutte le voci jndi in una macchina remota


44
2018-02-24 09:40


origine


risposte:


È possibile elencare tutte le voci di un InitialContext. Puoi usare questo snippet:

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

Se si utilizza un server applicazioni, di solito è disponibile l'opzione per esplorare l'albero JNDI.


74
2018-02-24 09:54



Lo so, c'è molto tempo dall'ultima risposta, ma avevo bisogno di elencare tutta l'origine dati jdbc disponibile in un contesto (contesto tomee).

Nel mio caso, avevo bisogno di più di list("") (purtroppo, questo non ha funzionato per me) per raggiungere il mio obiettivo. Ho trovato un elenco di nomi di nomi qui:

Naming Environment per i componenti dell'applicazione J2EE

Avendo questo, ho ottenuto tutte le risorse jdbc disponibili usando il successivo snippet di codice

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

È tutto.

Spero che questo possa aiutare qualcun altro, come mi aiuta.


18
2018-06-16 17:44



Le risposte precedenti non mi hanno dato il "quadro completo" (su Tomcat7), quindi ho combinato la seguente fusione, che converte i valori JNDI in una mappa ad albero (con toString valori):

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

Uso:

toMap(new InitialContext());

Fornisce il seguente output in 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"
      }
    }
  }
}

15
2018-05-04 07:21



Sto usando il seguente codice (non per la produzione):

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
2018-02-05 11:45