2010-02-24 9 views

risposta

72

E 'possibile elencare tutte le voci di un InitialContext. È possibile utilizzare questo frammento:

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

Se si utilizza un server di applicazioni, di solito c'è la possibilità di sfogliare l'albero JNDI.

+2

questo non l'albero completo in Tomcat. Solo ciò che l'utente ha creato all'interno di quell'istanza. C'è un modo per farlo su Tomcat? – John

+0

@John - aggiunto [la seguente risposta] (http://stackoverflow.com/questions/2324937/code-to-list-all-the-entries-in-jndi-on-remote-machine/37021007#37021007) che (si spera) affronta il problema (meglio tardi che mai). –

18

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 una lista ambiente di denominazione qui:

Naming Environment for J2EE Application Components

Avendo questo, ho avuto tutte le risorse JDBC disponibili utilizzando il codice seguente snippet

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

Questo è tutto.

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

14

Le risposte precedenti non mi ha dato il "quadro completo" (nella Tomcat7), così ho gettati insieme la seguente fusione, che converte i valori JNDI a una mappa 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; 
} 

utilizzati:

toMap(new InitialContext()); 

esprime il seguente output in Tomcat7:

{ 
    "comp": { 
    "env": { 
     "myCustomVar": "foobar" 
    }, 
    "UserTransaction": "Cannot create resource instance", 
    "Resources": { 
     "index.html": "[email protected]", 
     "WEB-INF": { 
     "ibm-web-ext.xml": "[email protected]", 
     "ibm-web-bnd.xml": "[email protected]" 
     } 
    } 
    } 
} 
0

Sto utilizzando il codice che segue (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

Sebbene questo snippet di codice possa essere la soluzione, [compresa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entally- code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – peacetype