2010-11-04 11 views
101

मैंने कुछ जेएनडीआई फैक्ट्री बीन को जोड़ते समय कुछ त्रुटियों को समझने की कोशिश कर अपने दिन का बहुत अधिक समय बिताया। समस्या पता चला कि बजाय इस के होने के लिए ...जावा क्या है: comp/env/do?

<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> 

मैं अनुमान कर जावा कि: कंप्यूटर अनुप्रयोग/env/शायद का संदर्भ कुछ वातावरण चर और ऐसा करता है कि, अंततः, मेरी संदर्भ फ़ाइल को देखा जाता है। केवल अंतर जावा है: comp/env /। एक विशेषज्ञ के मुंह से, वह क्या करता है?

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

+3

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

+1

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

उत्तर

90

नाम स्थान की जड़ संदर्भ में https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

का हवाला देते हुए सुरक्षित घटक से संबंधित बाइंडिंग के लिए नाम "COMP", जो एक सबट्री के लिए बाध्य है के साथ एक बाध्यकारी है। नाम "comp" घटक के लिए छोटा है। रूट संदर्भ पर कोई अन्य बाइंडिंग नहीं हैं। हालांकि, जड़ संदर्भ संसाधन नहीं घटक ही लेकिन इस तरह के उपयोगकर्ताओं या विभागों के रूप में संस्थाओं के अन्य प्रकार से बंधी हुई नामकरण के लिए नीति के भविष्य विस्तार के लिए आरक्षित है, विशेष रूप से । उदाहरण के लिए, भविष्य में नीतियां आपको और संगठनों/विभागों का नाम "जावा: उपयोगकर्ता/एलिस" और "जावा: संगठन/इंजीनियरिंग" जैसे नामों का उपयोग करके नाम दे सकती हैं।

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

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

उदाहरण के लिए, यदि आपके विन्यास है:

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

या तो आप "j निर्दिष्ट करने के लिए की जरूरत नहीं है तुम एक मध्यवर्ती कदम बना सकता है एवा: कंप्यूटर अनुप्रयोग/env "हर संसाधन के लिए आप को पुनः प्राप्त:

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

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

+4

आप "java: comp/env/foo" का उपयोग करके "foo" और लुकअप का उपयोग करके बाध्य करते हैं। Http://blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi/ – cherouvim

+3

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

33

वहाँ भी एक संपत्ति JndiObjectFactoryBean अर्थात, जब true करने के लिए सेट की resourceRef, स्वचालित रूप से स्ट्रिंग java:comp/env/ पहले जोड़ें करने के लिए करता है, तो यह पहले से ही मौजूद नहीं है प्रयोग किया जाता है।

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

धन्यवाद, यह वास्तव में टोमकैट और ग्लासफ़िश दोनों के साथ काम करता है। –

+0

यह टॉमकैट और जेटी दोनों के साथ भी काम करता है। – txedo

1

कई प्रयासों के बाद और बिलाव के स्रोत कोड में गहरी जा रहा मुझे पता चला है कि सरल संपत्ति useNaming="false" चाल किया था !! अब बिलाव नाम निराकरण जावा:/Liferayजावा के बजाय: कंप्यूटर अनुप्रयोग/env/Liferay

संबंधित मुद्दे