2010-02-24 68 views

回答

72

它可以列出一個InitialContext的所有條目所有的JNDI條目。您可以使用此代碼段:如果您在使用應用程序服務器

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

,通常有瀏覽JNDI樹的選項。

+2

這不完整的樹在Tomcat中。只有用戶在該實例中創建的內容。有沒有辦法在tomcat上做到這一點? – John 2014-07-04 13:22:32

+0

@John - 添加了[下面的答案](http://stackoverflow.com/questions/2324937/code-to-list-all-the-entries-in-jndi-on-remote-machine/37021007#37021007)其中(希望)解決您的問題(比從不遲到)。 – 2016-05-04 07:23:42

18

我知道,從最後一個答案開始有很多時間,但我需要列出上下文(tomee上下文)中可用的所有jdbc數據源。

在我的情況下,我需要超過list("")(遺憾的是,這對我來說不起作用)才能達到我的目標。 我發現了一個命名環境列表在這裏:

Naming Environment for J2EE Application Components

有了這個,我用下面的代碼所有可用的JDBC資源片斷

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

這就是全部。

我希望這可以幫助別人,幫助我。

14

以前的答案沒有給我的「全貌」(上Tomcat7),所以我一起拋出下面的合併,其將JNDI值的樹圖(與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; 
} 

用法:

toMap(new InitialContext()); 

給出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

我用下面的代碼(不用於生產):

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

儘管此代碼片段可能是解決方案,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-基於代碼的答案)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – peacetype 2018-02-05 12:02:06