リモートマシンのすべてのjndiエントリを一覧表示するコードを教えたり、指示したりできますか
InitialContextのすべてのエントリをリストすることができます。このスニペットを使用できます:
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("");
while (list.hasMore()) {
System.out.println(list.next().getName());
}
アプリケーションサーバーを使用している場合、通常、JNDIツリーを参照するオプションがあります。
これまでの回答では(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"
}
}
}
}
前回の回答からかなりの時間がありますが、コンテキスト(tomeeコンテキスト)で利用可能なすべてのjdbcデータソースをリストする必要がありました。
私の場合、目標を達成するためにlist("")
以上が必要でした(残念ながら、これはうまくいきませんでした)。私はここに命名環境リストを見つけました:
これを持って、次のコードスニペットを使用してすべての利用可能なjdbcリソースを取得しました
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("Java:comp/env/jdbc");
while (list.hasMore()) {
System.out.println(list.next().getName());
}
それで全部です。
私が助けてくれるように、これが他の人の助けになることを願っています。
私は次のコードを使用しています(本番用ではありません):
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) {}
}