Что делает java: comp/env/do?

Я потратил слишком много времени на то, чтобы выяснить некоторые ошибки при подключении JNDI factory bean. Проблема оказалась в том, что вместо этого...

<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 не связано в этом контексте".

Ответ 1

Цитата 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: орг/инженерия"

В контексте "comp" есть два привязки: "env" и "UserTransaction". Имя "env" привязано к поддереву который зарезервирован для компонента связанные с окружающей средой привязки, поскольку определяемый его дескриптором развертывания. "env" не подходит для окружающей среды. J2EE рекомендует (но не требует) следующая структура для "env" Пространство имен.

Итак, привязка, которую вы сделали от spring или, например, из дескриптора контекста 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");

Ответ 2

Существует также свойство resourceRef of 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