2010-11-04 2 views
101

Я просто потратил слишком много времени на свой день, пытаясь выяснить некоторые ошибки при подключении некоторых фабричных компонентов JNDI. Проблема оказалась в том, что вместо этого ...Что делает java: comp/env/do?

<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: комп/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». Каковы возможности для «текущих» контекстов? – Danny

ответ

90

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

В корневом контексте пространства имен является обязательным с именем «комп», который связан с поддерева защищены для связывания компонентов, связанных с. имя «comp» не подходит для компонента. Других привязок в корневом контексте нет. Тем не менее, корень контекст зарезервирован для будущего расширения политики, в частности, для именования ресурсов, которые связаны не с самого компонента, но и других типов объектов, таких как пользователи или отделов. Например, политики будущего могут позволить вам назвать пользователей и организациями/отделами с использованием таких имен, как «java: user/alice» и «java: org/engineering».

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

Так связывании вы сделали с весны или, к примеру, из описателя контекста Tomcat идут по умолчанию в Java: COMP/окр/

Например, если ваша конфигурация:

<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"); 

или вы могли бы сделать промежуточный шаг, так что вам не нужно указывать «J AVA: комп/ENV»для каждого ресурса вы извлекаете:

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

Я думал, что понял это правильно, но дальнейшие комментарии заставили меня понять, что я сделал это назад. Если дескриптор контекста tomcat по умолчанию, по умолчанию java: comp/env, не означает, что я могу опустить java: comp/env из значения? В моем случае мне пришлось добавить его, чтобы ошибка «Имя jdbc не была связана в этом контексте». – Danny

+4

Вы связываете с помощью «foo» и lookup с помощью «java: comp/env/foo». Взгляните на http://blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi/ – cherouvim

+3

Вышеупомянутая ссылка из самостоятельного учебника JNDI, изначально доступного по адресу: http://docs.oracle.com /javase/jndi/tutorial/beyond/misc/policy.html. –

33

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

Спасибо, что действительно работает как с Tomcat, так и с Glassfish. –

+0

Он также работает как с Tomcat, так и с Jetty. – txedo

1

После нескольких попыток и углубляясь в исходном коде Tomcat, я обнаружил, что простое свойство useNaming="false" сделал трюк !! Теперь Tomcat разрешает имена Java:/LifeRay вместо Java: комп/ENV/Liferay