Что делает 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 ответа:
в корневом контексте пространства имен является привязкой с именем " 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
ofJndiObjectFactoryBean
то есть, когда значение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" сделал свое дело!! Теперь котяра имена java: / liferay вместо java:comp / env / liferay