2010-02-24 8 views

Respuesta

72

Es posible enumerar todas las entradas de un InitialContext. Puede utilizar este fragmento:

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

Si está utilizando un servidor de aplicaciones, por lo general hay la opción de navegar por el árbol JNDI.

+2

esto no el árbol completo en Tomcat. Solo lo que el usuario ha creado dentro de esa instancia. ¿Hay alguna manera de hacerlo en tomcat? – John

+0

@John - agregó [la siguiente respuesta] (http://stackoverflow.com/questions/2324937/code-to-list-all-the-entries-in-jndi-on-remote-machine/37021007#37021007) que (con suerte) aborda su problema (mejor tarde que nunca). –

18

Lo sé, hay mucho tiempo de la última respuesta, pero necesitaba enumerar todos los orígenes de datos jdbc disponibles en un contexto (contexto de tomee).

En mi caso, necesitaba más de list("") (lamentablemente, esto no funcionó) para alcanzar mi objetivo. me encontré con una lista de nombres ambiente aquí:

Naming Environment for J2EE Application Components

Teniendo esto, tengo todos los recursos disponibles utilizando JDBC siguiente fragmento de código

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

eso es todo.

Espero que esto pueda ayudar a alguien más, ya que me ayuda.

14

Las respuestas anteriores no me dieron el "cuadro completo" (en Tomcat7), por lo que he tirado juntos la siguiente amalgama, que convierte los valores JNDI a un mapa de árbol (con valores de 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; 
} 

Uso:

toMap(new InitialContext()); 

dicta la siguiente salida en 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

Estoy utilizando el código siguiente (no para la producción):

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

Si bien este fragmento de código puede ser la solución, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-cob-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – peacetype

Cuestiones relacionadas