Подтвердить что ты не робот

Код для перечисления всех записей в jndi на удаленной машине

Может ли кто-нибудь сказать или указать мне код, чтобы перечислить все записи jndi на удаленном компьютере.

4b9b3361

Ответ 1

Можно перечислять все записи InitialContext. Вы можете использовать этот фрагмент:

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

Если вы используете сервер приложений, обычно существует возможность просмотра дерева JNDI.

Ответ 2

Я знаю, что есть много времени от последнего ответа, но мне нужно было перечислить весь источник данных jdbc, доступный в контексте (контекст tomee).

В моем случае мне понадобилось больше, чем list("") (к сожалению, это не сработало для меня), чтобы достичь моей цели. Здесь я нашел список имен:

Именование среды для компонентов приложения J2EE

После этого я получил все доступные ресурсы 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": "[email protected]",
      "WEB-INF": {
        "ibm-web-ext.xml": "[email protected]",
        "ibm-web-bnd.xml": "[email protected]"
      }
    }
  }
}