列出远程机器上 jndi 中所有条目的代码

Posted

技术标签:

【中文标题】列出远程机器上 jndi 中所有条目的代码【英文标题】:Code to list all the entries in jndi on remote machine 【发布时间】:2011-01-20 11:06:27 【问题描述】:

谁能告诉我或指点我列出远程机器中所有 jndi 条目的代码

【问题讨论】:

【参考方案1】:

可以列出 InitialContext 的所有条目。你可以使用这个sn-p:

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

如果您使用的是应用程序服务器,通常可以选择浏览 JNDI 树。

【讨论】:

这不是 tomcat 中的完整树。仅用户在该实例中创建的内容。有没有办法在tomcat上做到这一点? @John - 添加了the following answer,它(希望)解决了您的问题(迟到总比没有好)。【参考方案2】:

我需要列出一个上下文(tomee 上下文)中所有可用的 JDBC 数据源。

就我而言,我需要的不仅仅是list("")(遗憾的是,这对我不起作用)来实现我的目标。 我在这里找到了一个命名环境列表: Naming Environment for J2EE Application Components

有了这个,我使用以下代码 sn-p 获得了所有可用的 JDBC 资源:

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

就是这样。

我希望这可以帮助其他人,就像帮助我一样。

【讨论】:

【参考方案3】:

之前的答案没有给我“全貌”(在 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": "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"
      
    
  

【讨论】:

这是找出您所在位置的好方法。【参考方案4】:

我正在使用以下代码(不用于生产):

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) 

【讨论】:

虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 TestClientException 不是 java 异常。

以上是关于列出远程机器上 jndi 中所有条目的代码的主要内容,如果未能解决你的问题,请参考以下文章

我无法设置我的 jndi.properties 来访问 Jboss 5 上的远程 EJB

如何列出远程站点上可用的所有版本的 gem?

如何通过执行 log4j 注入来执行远程代码 [关闭]

使用arquillian测试远程客户端jndi查找

mysql远程连接的设置

如何在 Git 1.7+ 中列出所有远程分支?