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

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

112 голосов
/ 04 ноября 2010

Я просто потратил слишком много времени своего дня, пытаясь выяснить некоторые ошибки при подключении некоторого фабричного компонента 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 ]

97 голосов
/ 04 ноября 2010

Цитирование https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

В корневом контексте пространства имен это привязка с именем "комп", который связан с поддеревом, зарезервированным для привязок, связанных с компонентами. Название "comp" является сокращением от компонента. Других привязок на корневой контекст. Тем не менее, корень контекст зарезервирован для будущего расширение политики, в частности для именования ресурсов, которые не связаны к самому компоненту, но к другому типы объектов, таких как пользователи или ведомства. Например, будущее политики могут позволить вам называть пользователей и организации / отделы с помощью имена, такие как "Java: пользователь / Алиса" и "Java: орг / инженерия"

.

В контексте "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");
36 голосов
/ 10 января 2013

Существует также свойство 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 голосов
/ 17 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...