Как искать JNDI-ресурсы в WebLogic? - PullRequest
9 голосов
/ 28 июня 2011

Я развернул устаревшее приложение в WebLogic 11g.Приложение имеет следующий код:

 Context context = new InitialContext();
 dataSource = (javax.sql.DataSource) context.lookup("java:myDataSource");

У меня также есть источник данных, настроенный в WebLogic с именем JNDI:

     jdbc/myDataSource

Когда запускается вышеуказанный код Java, я получаюследующее исключение:

       javax.naming.NameNotFoundException: While trying to look up /myDataSource in /app/webapp/axis2.war/60105275.; remaining name '/myDataSource'
        at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)

      at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:144)

Я довольно новичок в JNDI, поэтому мой вопрос?Где разрыв в именовании?Что это значит, когда поиск по контексту имеет префикс "java:"?

Спасибо!

Ответы [ 4 ]

8 голосов
/ 29 июня 2011

Вы должны просто сделать это:

Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");

Если вы ищете его из удаленного места назначения, вам нужно использовать фабрику начального контекста WL, например:

Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, pURL); //For example "t3://127.0.0.1:7001"
h.put(Context.SECURITY_PRINCIPAL, pUsername);
h.put(Context.SECURITY_CREDENTIALS, pPassword);

InitialContext context = new InitialContext(h);
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");

weblogic.jndi.WLInitialContextFactory

6 голосов
/ 28 июня 2011

java - корневое пространство имен JNDI для ресурсов.Исходный фрагмент кода означает, что контейнер, в котором изначально было развернуто приложение, не применял никаких дополнительных пространств имен к полученному контексту JNDI (например, Tomcat автоматически добавляет все ресурсы в пространство имен comp/env, поэтомуdataSource = (javax.sql.DataSource) context.lookup("java:comp/env/jdbc/myDataSource");, если имя ссылки на ресурс - jdbc/myDataSource).

Чтобы избежать необходимости изменять свой устаревший код, я думаю, что если вы зарегистрируете источник данных с именем myDataSource (удалите jdbc/)у тебя должно быть все в порядке.Дайте мне знать, если это работает.

1 голос
/ 09 октября 2013

Мне просто пришлось обновить устаревшее приложение Weblogic 8, чтобы использовать источник данных вместо жестко закодированной строки JDBC.Имя JNDI источника данных на вкладке конфигурации в администраторе Weblogic показало: «weblogic.jdbc.ESdatasource», ниже работают два способа:

      Context ctx = new InitialContext();
      DataSource dataSource;

      try {
        dataSource = (DataSource) ctx.lookup("weblogic.jdbc.ESdatasource");
        response.getWriter().println("A " +dataSource);
      }catch(Exception e) {
        response.getWriter().println("A " + e.getMessage() + e.getCause());
      }

      //or

      try {
        dataSource = (DataSource) ctx.lookup("weblogic/jdbc/ESdatasource");
        response.getWriter().println("F "+dataSource);
      }catch(Exception e) {
        response.getWriter().println("F " + e.getMessage() + e.getCause());
      }

      //use your datasource
      conn = datasource.getConnection();

Это все, ребята.Внутри приложения Weblogic не требуются пароли и исходная фабрика контекста.

1 голос
/ 13 марта 2013

У меня была похожая проблема с этим.Это было решено путем удаления префикса java:comp/env/ и использования jdbc/myDataSource в контекстном поиске.Так же, как кто-то указал в комментариях.

...