Co znaczy java: comp / env / do?

116

Po prostu spędziłem zbyt dużo czasu w ciągu dnia, próbując znaleźć błędy podczas podłączania fabrycznej fasoli JNDI. Problem okazał się taki, że zamiast tego ...

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

Właściwie to napisałem ...

<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ądany jest mój plik kontekstu. Jedyna różnica to java:comp/env/. Z ust eksperta, co to robi?

Bez java:comp/env/przedrostka w wartości wystąpiłby błąd o treści „Nazwa jdbc nie jest związana w tym kontekście” .

Danny
źródło
3
Którego używasz na początku? Twoje pytanie sugeruje, że nieprawidłowo użyłeś drugiego przykładu ( jdbc/loci dlatego java:comp/env/jdbc/locjest poprawna), podczas gdy odpowiedź cherouvima sugeruje, że nieprawidłowo użyłeś pierwszego przykładu ( java:comp/env/jdbc/loci dlatego jdbc/locjest poprawna). Niezależnie od tego, prawdziwa odpowiedź brzmi: zależy to od aktualnego kontekstu.
BalusC
1
W tym, który nie działał, rzeczywiście brakowało java: comp / env / jdbc / loc, jak sugerowano. Wskazany plik kontekstu zawiera zasób „loc”. Jakie są możliwości dla „obecnych” kontekstów?
Danny

Odpowiedzi:

100

Cytując 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 znajduje się powiązanie o nazwie „comp”, które jest powiązane z poddrzewem zarezerwowanym dla powiązań związanych ze składnikami. Nazwa „comp” jest skrótem od komponentu. W kontekście głównym nie ma innych powiązań. Jednak kontekst główny jest zarezerwowany dla przyszłych rozszerzeń zasad, w szczególności dla nazewnictwa zasobów, które są powiązane nie z samym komponentem, ale z innymi typami jednostek, takich jak użytkownicy lub działy. Na przykład przyszłe zasady mogą umożliwić nadawanie nazw użytkownikom i organizacjom / działom przy użyciu nazw takich jak „java: użytkownik / alicja” i „java: org / engineering”.

W kontekście „comp” istnieją dwa powiązania: „env” i „UserTransaction”. Nazwa „env” jest powiązana z poddrzewem, które jest zarezerwowane dla powiązań związanych ze środowiskiem komponentu, zgodnie z definicją w deskryptorze wdrażania. „env” to skrót od environment. J2EE zaleca (ale nie wymaga) następującą strukturę dla przestrzeni nazw „env”.

Więc powiązanie, które zrobiłeś od wiosny lub, na przykład, z deskryptora kontekstu tomcat, przechodzi domyślnie w java: 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 bezpośredni dostęp za pomocą:

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

lub możesz wykonać krok pośredni, aby nie musieć określać „java: comp / env” dla każdego pobieranego zasobu:

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");
cherouvim
źródło
Wydawało mi się, że dobrze to zrozumiałem, ale dalsze komentarze uświadomiły mi, że zrobiłem to wstecz. Gdyby deskryptor kontekstu tomcat był domyślnie umieszczony w java: comp / env, czy nie oznaczałoby to, że mogę pominąć java: comp / env w wartości? W moim przypadku musiałem go dodać, aby błąd „Nazwa jdbc nie jest powiązany w tym kontekście” zniknął.
Danny
4
Łączysz się używając "foo" i wyszukujesz używając "java: comp / env / foo". Zajrzyj na blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim
3
Powyższe łącze pochodzi z samodzielnego samouczka JNDI, pierwotnie dostępnego pod adresem : docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html .
Danilo Piazzalunga
co, jeśli w twoim wyszukiwaniu jest więcej / -ów? Na przykład: „java: com / env / foo / bar”, czy wartość parametru jndiName to „foo / bar” czy „foo.bar”?
Pieter De Bie
Prawidłowa wartość jndiName to „foo / bar” @PieterDeBrie.
tftdias
37

Istnieje również nieruchomość resourceRefo JndiObjectFactoryBeanto, kiedy ustawiony true, używany do automatycznego poprzedzić ciąg java:comp/env/, jeśli nie jest już obecny.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>
Filip Spiridonov
źródło
3

Po kilku próbach i zagłębieniu się w kod źródłowy Tomcata odkryłem, że prosta właściwość useNaming = "false" załatwiła sprawę !! Teraz Tomcat rozpoznaje nazwy java: / liferay zamiast java: comp / env / liferay

Thiago Leão Moreira
źródło
Czy możesz podać pełny przykład, w tym definicję zasobów? Nie udało mi się to pomyślnie skonfigurować z Tomcat 8.5 - być może bardziej wszechstronny przykład pomoże mi dostrzec mój błąd.
RobertG,