WebSphere: ошибка поиска контекста JNDI

У меня есть следующее...

Context aContext = = new InitialContext(settings);
aContext.lookup("java:comp/env/DB2_DB");

Также попытался...

aContext.lookup("DB2_DB");

web.xml

<resource-ref>
    <description>
    </description>
    <res-ref-name>DB2_DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>DB2_DB</mapped-name>
</resource-ref>

то в моем ibm-web-bnd.xml...

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" />

В Websphere я вижу имя привязки в ресурсах > JDBC > Источники данных

Но когда я запускаю свое приложение, я вижу...

Вызвано: javax.naming.NameNotFoundException: Контекст: Node04Cell/nodes/Node04/servers/server1, name: DB2_DB: первый компонент в имени DB2_DB не найден. [Исключение корня - org.omg.CosNaming.NamingContextPackage.NotFound: IDL: omg.org/CosNaming/NamingContext/NotFound: 1.0] ^ M

Это проект порта из WAS6-8.5

Ответ 1

Ну, этот вопрос довольно старый, и я вижу, что ответа нет, так что.

Вот что действительно происходит:

  • Ваш код выполняет поиск JNDI на java:comp/env/DB2_DB.
  • WebSphere использует дескриптор дескриптора WAS (ibm-web-bnd.xml) для "перевода" привязки приложения DB2_DB в настоящее имя в дереве WebSphere JNDI (jdbc/DB2DB).
  • WebSphere просматривает jdbc/DB2DB и возвращает его вызывающему.

Вы получаете NameNotFoundException в поиске first - поиск java:comp/env/DB2_DB. Проблема заключается не в поиске jdbc/DB2DB; он обнаруживает DB2_DB внутри вашей среды компонента.

Дескриптор развертывания выглядит хорошо для меня, поэтому я предполагаю, что причиной вашей проблемы является следующее:

Context aContext = new InitialContext(settings);

Вы создаете экземпляр InitialContext, предоставляя Hashtable. Hashtable часто полезен, когда вам нужно предоставить специальные параметры для построения, , но вы должны знать, когда его использовать и когда его избегать. Код, который запускается внутри контейнера JavaEE и требует простого доступа к дереву JNDI контейнера редко, если он когда-либо должен предоставлять любой Hashtable конструктору InitialContext.

Я бы не удивился, если те settings, что вы переходите в InitialContext, содержат, например, ключ PROVIDER_URL, указывающий, что поиск произойдет на каком-то удаленном внешнем дереве JNDI.

Итак, я бы начал с утилизации этого параметра:

Context aContext = new InitialContext();

И затем сделайте еще один снимок.

Если это все еще не удается, используйте утилиту WebSphere dumpNamespace, чтобы получить четкое представление о дереве WebSphere JNDI.

Ответ 2

Я не уверен, что делает ibm-web-bnd.xml, однако вы можете попробовать две вещи.

Сначала вы можете попробовать глобальный поиск. Пытаться:

aContext.lookup("jdbc/DB2DB");

Я предполагаю, что источник данных называется "jdbc/DB2DB" с конфигурацией источника данных.

В противном случае вы должны проверить, сопоставлен ли источник данных в вашем приложении. Я полагаю, что ibm-web-bnd.xml должен правильно настроить это сопоставление.

Ответ 3

Дамп пространства имен и найдите jndi под целью, которую вы хотите найти. Если он не найден, обновите URL-адрес corbaloc до значения, указанного в целевом объекте. Поскольку поиск работал в моем локальном, но не работал в кластерной среде. Я сбросил пространство имен и определил URL-адрес corbaloc. Затем использовался URL-адрес corbaloc в среде SIT.

Пример: JMS_HOST был corbaloc :: localhost: 2809/NameServiceServerRoot в локальном, но в кластерной среде это был JMS_HOST = corbaloc :: ABC-DEF-XYZ: 9810/NameServiceServerRoot

Это решило мою проблему.