列出远程机器上 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 中所有条目的代码的主要内容,如果未能解决你的问题,请参考以下文章