Що означає java: comp / env / do?


116

Я просто витратив занадто багато часу свого дня, намагаючись з’ясувати деякі помилки під час підключення до заводських бобів JNDI. Проблема виявилася в тому, що замість цього ...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>

Я насправді це написав ...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>

Я роблю висновок, що, java:comp/env/можливо, посилається на якусь змінну середовища, і робить це таким чином, щоб, зрештою, переглядати мій файл контексту. Єдина відмінність java:comp/env/. З уст експерта що це робить?

Без java:comp/env/префікса у значенні я отримав би помилку, яка сказала "Ім'я jdbc не пов'язане в цьому контексті" .


3
Кого ви спочатку використовували? Ваше запитання означає, що ви неправильно використовували другий приклад ( jdbc/locі, таким чином, java:comp/env/jdbc/locє правильним), тоді як відповідь cherouvim означає, що ви неправильно використовували перший приклад ( java:comp/env/jdbc/locі, таким чином, jdbc/locє правильним). Незалежно від цього справжня відповідь: це залежить від поточного контексту.
BalusC

1
Той, хто не працював, насправді бракував java: comp / env / jdbc / loc, як мається на увазі. Файл контексту, на який вказували, містив ресурс "loc". Які можливості є для "поточних" контекстів?
Денні

Відповіді:


100

Цитуючи https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

У кореневому контексті простору імен - прив'язка до імені "comp", яка пов'язана з піддеревом, зарезервованим для прив'язки до компонентів. Назва "comp" є короткою для компонента. Інших прив’язок у кореневому контексті немає. Однак кореневий контекст зарезервований для подальшого розширення політики, зокрема для іменування ресурсів, прив'язаних не до самого компонента, а до інших типів сутностей, таких як користувачі чи відділи. Наприклад, майбутні політики можуть дозволяти називати користувачів та організації / відділи, використовуючи такі назви, як "java: user / alice" та "java: org / engineering".

У контексті "comp" є два прив'язки: "env" та "UserTransaction". Ім’я "env" прив'язане до піддерева, яке зарезервовано для пов'язаних із середовищем компонентів прив'язок, як визначено його дескриптором розгортання. "env" - коротке середовище. J2EE рекомендує (але не вимагає) наступну структуру для простору імен "env".

Отже, прив'язка, яку ви робили з весни або, наприклад, з дескриптора контексту tomcat, переходить за замовчуванням під java: comp / env /

Наприклад, якщо ваша конфігурація:

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>

Тоді ви можете отримати доступ до нього безпосередньо за допомогою:

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");

або ви можете зробити проміжний крок, тому вам не потрібно вказувати "java: comp / env" для кожного завантаженого ресурсу:

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");

Я думав, що я це правильно зрозумів, але з подальших коментарів я дав зрозуміти, що я це зробив назад. Якщо дескриптор контексту tomcat за замовчуванням перейшов під java: comp / env, чи це не означає, що я можу опустити java: comp / env зі значення? У моєму випадку мені довелося додати це, щоб помилка "Ім'я jdbc не пов'язане в цьому контексті".
Денні

4
Ви пов'язуєте за допомогою "foo" та пошуку за допомогою "java: comp / env / foo". Подивіться на blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
Наведене вище посилання знаходиться в окремому підручнику JNDI, спочатку доступному на: docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html .
Данило П'яццалунга

що робити, якщо у вашому пошуку більше / -е? Як: "java: com / env / foo / bar", чи є ваше значення jndiName "foo / bar" або "foo.bar"?
Пітер Де Бі

Правильне значення jndiName буде "foo / bar" @PieterDeBrie.
tftdias

37

Існує також властивість resourceRefв JndiObjectFactoryBeanтому , що є, коли встановлено true, використовується для автоматичного випереджати рядок , java:comp/env/якщо вона вже не присутній.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>

3

Після кількох спроб і заглиблення у вихідний код Tomcat я з'ясував, що проста властивість useNaming = "false" зробила трюк !! Тепер Tomcat вирішує імена java: / liferay замість java: comp / env / liferay


Чи можете ви надати повний приклад, включаючи визначення ресурсу? Мені не вдалося успішно встановити це за допомогою Tomcat 8.5 - можливо, більш всебічний приклад допоможе мені побачити мою помилку.
RobertG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.