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

3 ответов


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

в корневом контексте пространства имен является привязкой с именем " comp", который привязан к зарезервированному поддереву для Привязок, связанных с компонентами. Этот имя "comp" сокращенно от component. Нет никаких других Привязок в корневой контекст. Однако, корень контекст зарезервирован для будущего расширение политика, в частности для именования ресурсов, которые не привязаны к самому компоненту, но к другому типы сущностей, таких как пользователи или отделы. Например, будущее политики могут позволить вам называть пользователей и организаций / департаментов, используя такие имена, как" java:user/alice " и "java: org / engineering".

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

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

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

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