Do czego służy java: comp / env/?

Po prostu spędziłem zbyt dużo czasu mojego dnia próbując znaleźć jakieś błędy podczas podłączania jakiejś fasoli JNDI factory. Problemem okazało się to, a nie to...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
Napisałam to...
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>

Wnioskuję, że java:comp/env/ być może odwołuje się do jakiejś zmiennej środowiskowej i sprawia, że ostatecznie przegląda się mój plik kontekstowy. Jedyną różnicą jest java: comp / env/. Z ust eksperta, co to robi?

Bez java: comp/ENV prefiks w wartości, chciałbym dostać błąd, który powiedział "Nazwa jdbc nie jest związana w tym kontekście".

Author: Danny, 2010-11-04

3 answers

Cytowanie https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

W głównym kontekście przestrzeni nazw jest oprawą o nazwie " comp", który jest związany z podzbiorem zarezerwowanym dla wiązań związanych z komponentami. Na nazwa "comp" jest skrótem od component. Nie ma innych wiązań na kontekst główny. Jednak korzeń kontekst jest zarezerwowany dla przyszłości rozszerzenie polityki, w szczególności do nazywania zasobów, które nie są związane do samego komponentu, ale do innych rodzaje podmiotów, takich jak użytkownicy lub wydziały. Na przykład przyszłość zasady mogą pozwalać na nazywanie użytkowników i organizacji/działów za pomocą nazwy takie jak "java: user / alice" i java: org / engineering.

W kontekście "comp" istnieją dwa powiązania: "env" i "UserTransaction". Nazwa " env " jest związana z podzbiorem który jest zarezerwowany dla komponentu wiązania związane ze środowiskiem, jak zdefiniowany przez jego deskryptor wdrażania. "env" to skrót od environment. Na J2EE zaleca (ale nie wymaga) następująca struktura " env" przestrzeń nazw.

Tak więc powiązanie, które wykonałeś z springa lub, na przykład, z deskryptora kontekstu tomcat, domyślnie znajduje się w Javie: comp / env /

Na przykład, jeśli Twoja konfiguracja to:

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>

Następnie możesz uzyskać do niego dostęp bezpośrednio za pomocą:

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

Albo możesz zrobić krok pośredni, więc nie musisz określać "java: comp / env"dla każdego pobranego zasobu:

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");
 92
Author: cherouvim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 01:59:43

Istnieje również właściwość resourceRef z JndiObjectFactoryBean, która po ustawieniu na true służy do automatycznego poprzedzania łańcucha java:comp/env/, Jeśli nie jest on jeszcze obecny.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>
 34
Author: Filip Spiridonov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 17:09:37

Po kilku próbach i zagłębianiu się w kod źródłowy Tomcata, dowiedziałem się, że prosta Właściwość useNaming="false" zadziałała!! Teraz Tomcat rozwiązuje nazwy java: / liferay zamiast java: comp / env / liferay

 1
Author: Thiago Leão Moreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 19:21:06