Quelqu'un peut-il me dire ou m'indiquer un code pour lister toutes les entrées jndi d'une machine distante
Il est possible de lister toutes les entrées d'un InitialContext. Vous pouvez utiliser cet extrait:
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("");
while (list.hasMore()) {
System.out.println(list.next().getName());
}
Si vous utilisez un serveur d'applications, vous avez généralement la possibilité de parcourir l'arborescence JNDI.
Je sais qu'il reste beaucoup de temps depuis la dernière réponse, mais je devais répertorier toutes les sources de données jdbc disponibles dans un contexte (contexte tomee).
Dans mon cas, il me fallait plus que list("")
(malheureusement, cela ne fonctionnait pas pour moi) pour atteindre mon objectif .
Environnement de nommage pour les composants d'application J2EE
Ayant cela, j'ai obtenu toutes les ressources jdbc disponibles en utilisant l'extrait de code suivant
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("Java:comp/env/jdbc");
while (list.hasMore()) {
System.out.println(list.next().getName());
}
C'est tout.
J'espère que cela peut aider quelqu'un d'autre, tout comme moi.
Les réponses précédentes ne me donnant pas une "image complète" (sur Tomcat7), j'ai donc rassemblé la fusion suivante, qui convertit les valeurs JNDI en une arborescence (avec des valeurs 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;
}
Utilisation:
toMap(new InitialContext());
Donne la sortie suivante dans 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"
}
}
}
}
J'utilise le code suivant (pas pour la production):
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) {}
}