Java: comp / env / do ne yapar?


116

Bir JNDI fabrika fasulyesini bağlarken bazı hataları anlamaya çalışmak için günümün çok fazla zamanını harcadım. Sorun bunun yerine şu oldu ...

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

Aslında bunu yazmıştım ...

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

Bunu anlaması java:comp/env/belki sonuçta, benim bağlam dosyası bakıldığında, bazı ortam değişkeni başvuran ve böylece onu yapar. Tek fark şudur java:comp/env/. Bir uzmanın ağzından bu ne işe yarar?

Değerde java:comp/env/önek olmadan, "jdbc adı bu Bağlamda bağlı değil" şeklinde bir hata alırdım .


3
Başlangıçta hangisini kullandınız? Sorunuz, ikinci örneği yanlış kullandığınızı ima ediyor ( jdbc/locve bu nedenle java:comp/env/jdbc/locdoğru), oysa cherouvim'in cevabı, ilk örneği yanlış kullandığınızı ima ediyor ( java:comp/env/jdbc/locve bu nedenle jdbc/locdoğrudur). Ne olursa olsun, gerçek cevap şudur: mevcut duruma bağlıdır .
BalusC

1
İşe yaramayan, ima edildiği gibi java: comp / env / jdbc / loc eksikti. "Loc" kaynağını içerdiği belirtilen bağlam dosyası. "Güncel" bağlamlar için olasılıklar nelerdir?
Danny

Yanıtlar:


100

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

Ad alanının kök bağlamında, bileşenle ilgili bağlamalar için ayrılmış bir alt ağaca bağlı olan "comp" adlı bir bağlama bulunur. "Comp" adı, bileşenin kısaltmasıdır. Kök bağlamda başka bağlama yoktur. Ancak, kök bağlam, politikanın gelecekteki genişletilmesi için, özellikle bileşenin kendisine değil, kullanıcılar veya departmanlar gibi diğer varlık türlerine bağlı kaynakların adlandırılması için ayrılmıştır. Örneğin, gelecekteki politikalar, "java: kullanıcı / alice" ve "java: org / mühendislik" gibi adlar kullanarak kullanıcıları ve kuruluşları / departmanları adlandırmanıza izin verebilir.

"Comp" bağlamında, iki bağlama vardır: "env" ve "UserTransaction". "Env" adı, dağıtım tanımlayıcısında tanımlandığı gibi bileşenin çevreyle ilgili bağlamaları için ayrılmış bir alt ağaca bağlıdır. "env", ortamın kısaltmasıdır. J2EE, "env" ad alanı için aşağıdaki yapıyı önerir (ancak gerektirmez).

Yani, yaydan veya örneğin bir tomcat bağlam tanımlayıcısından yaptığınız bağlama, varsayılan olarak java: comp / env / altına gider

Örneğin, yapılandırmanız şuysa:

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

Daha sonra aşağıdakileri kullanarak doğrudan erişebilirsiniz:

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

veya aldığınız her kaynak için "java: comp / env" belirtmenize gerek kalmaması için bir ara adım atabilirsiniz:

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

Bunu doğru anladığımı sanıyordum, ancak daha fazla yorum, bu kadar geriye gittiğimi anlamamı sağladı. Tomcat bağlam tanımlayıcısı varsayılan olarak java: comp / env altına giderse, bu java: comp / env değerini değerden çıkarabileceğim anlamına gelmez mi? Benim durumumda, "jdbc adı bu Bağlamda bağlı değil" hatasını ortadan kaldırmak için eklemek zorunda kaldım.
Danny

4
"Foo" kullanarak bağlanır ve "java: comp / env / foo" ile arama yaparsınız. Blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
Yukarıdaki bağlantı, orijinal olarak docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html adresinde bulunan bağımsız JNDI eğitimindendir .
Danilo Piazzalunga

ya aramanızda daha fazla / -es varsa? Gibi: "java: com / env / foo / bar", jndiName değeriniz "foo / bar" veya "foo.bar" mı?
Pieter De Bie

Doğru jndiName değeri "foo / bar" @PieterDeBrie olacaktır.
tftdias

37

Bir özellik de bulunmaktadır resourceRefait JndiObjectFactoryBeanayarlandığında yani, trueotomatik dize getirebilirsiniz için kullanılan, java:comp/env/zaten mevcut değilse.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>

3

Birkaç denemeden ve Tomcat'in kaynak kodunu derinlemesine inceledikten sonra, useNaming = "false" basit özelliğinin hile yaptığını öğrendim !! Artık Tomcat java: comp / env / liferay yerine java: / liferay adlarını çözüyor


Kaynak tanımı da dahil olmak üzere eksiksiz bir örnek verebilir misiniz? Bunu Tomcat 8.5 ile başarılı bir şekilde kurmayı başaramadım - daha kapsamlı bir örnek belki hatamı görmeme yardımcı olabilirdi.
RobertG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.