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
Это решило мою проблему.