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".
3 answers
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");
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>
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
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