जावा क्या करता है: COMP / env / करते हैं?


116

मैंने अभी अपने दिन का बहुत समय बिताया है जब कुछ JNDI फ़ैक्टरी बीन को हुक करते समय कुछ त्रुटियों का पता लगाने की कोशिश की जा रही है। समस्या यह है कि इसके बजाय ...

<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:comp/env/शायद कुछ पर्यावरण चर का संदर्भ देता है और इसे ऐसा बनाता है कि, अंततः, मेरी संदर्भ फ़ाइल को देखा जाता है। फर्क सिर्फ इतना है java:comp/env/। एक विशेषज्ञ के मुंह से, वह क्या करता है?

java:comp/env/मूल्य में उपसर्ग के बिना , मुझे एक त्रुटि मिलेगी जिसने कहा कि "नाम jdbc इस संदर्भ में बाध्य नहीं है"


3
शुरू में आपने किसका उपयोग किया था? आपके प्रश्न का अर्थ है कि आप गलत तरीके से दूसरे उदाहरण का उपयोग कर रहे थे ( jdbc/locऔर इस प्रकार java:comp/env/jdbc/locसही है), जबकि चेरोविम का उत्तर यह बताता है कि आप गलत तरीके से पहले उदाहरण का उपयोग कर रहे थे ( java:comp/env/jdbc/locऔर इस तरह jdbc/locसही है)। भले ही, असली जवाब यह है: यह वर्तमान संदर्भ पर निर्भर करता है।
बालुस सी सी

1
जो काम नहीं करता था वह वास्तव में याद आ रहा था जावा: COMP / env / jdbc / loc, जैसा कि निहित है। संदर्भ फ़ाइल जिसे "लोक" संसाधन शामिल करने के लिए कहा गया था। "वर्तमान" संदर्भों के लिए क्या संभावनाएं हैं?
डैनी

जवाबों:


100

का हवाला देते हुए 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 / इंजीनियरिंग" जैसे नामों का उपयोग करके उपयोगकर्ताओं और संगठनों / विभागों का नाम देने की अनुमति दे सकती हैं।

"COMP" संदर्भ में, दो बाइंडिंग हैं: "env" और "UserTransaction"। "Env" नाम एक सबट्री के लिए बाध्य है जो घटक के पर्यावरण से संबंधित बाइंडिंग के लिए आरक्षित है, जैसा कि इसके तैनाती विवरणक द्वारा परिभाषित किया गया है। "env" पर्यावरण के लिए छोटा है। J2EE "env" नामस्थान के लिए निम्नलिखित संरचना की सिफारिश करता है (लेकिन इसकी आवश्यकता नहीं है)।

तो आपने जो बंधन वसंत से किया है या, उदाहरण के लिए, एक टॉमकैट संदर्भ डिस्क्रिप्टर से जावा के तहत डिफ़ॉल्ट रूप से जाना: COMP / en /

उदाहरण के लिए, यदि आपका कॉन्फ़िगरेशन है:

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

या आप एक मध्यवर्ती कदम बना सकते हैं ताकि आपको हर संसाधन के लिए "java: comp / env" निर्दिष्ट न करना पड़े:

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

मुझे लगा कि मैंने इसे सही तरीके से समझा है, लेकिन आगे की टिप्पणियों ने मुझे एहसास दिलाया कि मैंने इतना पिछड़ा हुआ था। यदि टॉमकैट संदर्भ डिस्क्रिप्टर चला गया, डिफ़ॉल्ट रूप से, जावा के तहत: COMP / env, इसका मतलब यह नहीं होगा कि मैं जावा को छोड़ सकता हूं: मान से COMP / env? मेरे मामले में, मुझे यह जोड़ने के लिए "नाम jdbc इस संदर्भ में बाध्य नहीं है" त्रुटि दूर जाना है।
डैनी

4
आप "फू" और लुकिंग का उपयोग करके "जावा: कॉम्प / एनव / फू" का उपयोग करके बांधते हैं। Blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
उपरोक्त लिंक स्टैंडअलोन जेएनडीआई ट्यूटोरियल से है, जो मूल रूप से उपलब्ध है: docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html
डैनिलो पियाज़ालुंगा 16

क्या होगा यदि आपके लुकअप में अधिक / -es हैं? जैसे: "java: com / env / foo / bar", क्या आपका jndiName मान "foo / bar" या "foo.bar" है?
पीटर डी ब्यू

सही jndiName मान "foo / bar" @PieterDeBrie होगा।
tftdias 23

37

एक संपत्ति भी नहीं है 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>

3

कई प्रयासों के बाद और टॉमकैट के स्रोत कोड में गहराई से जाने पर मुझे पता चला कि सरल संपत्ति का उपयोग करना = "झूठा" ने चाल चली !! अब टॉमकैट जावा के बजाय जावा: / जीवनरक्षक नाम का निर्धारण करता है : COMP / env / liferay


क्या आप संसाधन परिभाषा सहित एक पूर्ण उदाहरण प्रदान कर सकते हैं? मैंने टॉमकैट 8.5 के साथ इसे सफलतापूर्वक स्थापित करने का प्रबंधन नहीं किया - एक अधिक व्यापक उदाहरण मुझे मेरी गलती को देखने में मदद करेगा, शायद।
रॉबर्ट जीएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.