2011-03-04 12 views
6

मुझे स्प्रिंग के साथ जेएनडीआई के लिए मेरी कॉन्फ़िगरेशन सेट करने में समस्या है। मैंने अन्य पदों की जांच की लेकिन मेरी समस्या हल नहीं हो सका। मैं टॉमकैट 6 का उपयोग अपने कंटेनर के रूप में कर रहा हूं। मेरी समझ से मुझे सर्वर पर संसाधन स्थापित करने की आवश्यकता है। तो मेरी server.xml फ़ाइल में मैं इस है:स्प्रिंग जेन्डी कॉन्फ़िगरेशन, सर्वर.एक्सएमएल

<GlobalNamingResources> 
    <Resource auth="Container" driverClassName="org.postgresql.Driver" 
      maxActive="100" maxIdle="5" maxWait="10000" 
      minEvictableIdleTimeMillis="60000" name="jdbc/myTomcatPool" 
      password="password" testOnBorrow="true" testWhileIdle="true" 
      timeBetweenEvictionRunsMillis="10000" type="javax.sql.DataSource" 
      url="jdbc:postgresql://localhost:5432/postgis" username="postgres" 
      validationQuery="SELECT 1"/> 
</GlobalNamingResources> 

मैं में निम्नलिखित है मेरी spring-context.xml (जो classpath पर है):

<Context path="/myApp" reloadable="true" cacheMaxSize="51200" 
     cacheObjectMaxSize="2560"> 
    <ResourceLink global="jdbc/myTomcatPool" name="jdbc/myTomcatPool" 
      type="javax.sql.DataSource"/> 
</Context> 
:

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool" /> 

<bean id="geoCodeService" class="com.sample.SampleImpl"> 
    <property name="dataSource" ref="geoCodeData"/> 
</bean> 

मैं तो फ़ाइल META-INF/context.xml में इस राशि

मेरा सर्वर त्रुटियों से मुक्त हो जाता है।

जब मैं निम्नलिखित परीक्षण चलाने का प्रयास (जो काम किया इससे पहले कि मैं JNDI कोड जोड़ा):

public class Test { 
    public static void main(String[] args) { 
     ApplicationContext ctx = 
      new ClassPathXmlApplicationContext("spring-context.xml"); 
    } 
} 

मैं निम्नलिखित त्रुटि मिलती है:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'geoCodeData': Invocation of init method failed;

nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

मेरी विन्यास गलत है या है जिस तरह से मैं परीक्षण को गलत चलाने की कोशिश कर रहा हूं?

उत्तर

11

जब आप अपने टेस्टकेस चलाते हैं, तो आप जेएनडीआई लुकअप के बजाय जेडीबीसी का उपयोग करना चाहेंगे। सरल कारण यह है कि आप आमतौर पर एप्लिकेशन सर्वर से अपने टेस्टकेस नहीं चलाते हैं। इस प्रकार, जेएनडीआई लुकअप असफल हो जाएगा।

मैं अपने अंत में क्या करता हूं डेटा स्रोत को एक अलग फ़ाइल में रखना है।

परियोजना datasource.xml

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool"></jee:jndi-lookup> 

... इकाई परीक्षण के लिए एक और एक और फ़ाइल JDBC का उपयोग करता है: - -:

परियोजना मैं JNDI का उपयोग करता है के उत्पादन के लिए एक फ़ाइल है डेटा स्रोत-test.xml

// use the same bean name "geoCodeData" 
<bean id="geoCodeData" class="..."> 
    <property name="driverClassName" value="..." /> 
    <property name="url" value="..." /> 
    <property name="username" value="..." /> 
    <property name="password" value="..." /> 
</bean> 

वेब एप्लिकेशन का उपयोग करेगा जनसंपर्क oject-datasource.xml जबकि इकाई परीक्षण प्रोजेक्ट-डेटासॉर-test.xml का उपयोग करेगा।

+0

यह समझ में आता है। मैंने सोचा कि इसे केवल टेस्ट केस के साथ करना पड़ सकता है। मैं कोशिश करूँगा मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं। एक बार फिर धन्यवाद। एक आखिरी सवाल है, तो मैं अपने web.xml में संदर्भ कॉन्फिग्लोकेशन की मेरी सूची में प्रोजेक्ट-डेटासॉर.एक्सएमएल जोड़ूंगा और मेरे उदाहरणों जैसे प्रोजेक्ट-डेटासोर्स-test.xml का उपयोग करूंगा? – blong824

+1

क्या एक चालाक समाधान है! बीटीडब्ल्यू, आप अपने एप कॉन्फ़िगरेशन एक्सएमएल में नव निर्मित बनाई गई डेटासोर्स फ़ाइल का उपयोग कर सकते हैं: '' और समान रूप से। चीयर्स! – acdcjunior

3

मेरे (पहले से ही स्पैस) बालों को फाड़ने के कई घंटों के बाद मैंने ओरेकल के डेटाबेस कनेक्शन को पूल करने के लिए अपना टॉमकैट सर्वर प्राप्त करने और स्प्रिंग फ्रेमवर्क का उपयोग करने में कामयाब रहा है। हालांकि मैं इस सवाल का जवाब दूंगा, भले ही कोई जवाब न हो, बस अगर किसी और की मदद की जाती है।

मैं क्या चाहता था: टोमकैट (प्रति सर्लेट के बजाए) और टॉमकैट सर्वर कॉन्फ़िगरेशन (फिर से, सर्वलेट कॉन्फ़िगरेशन फ़ाइलों की बजाय) में डीबी कनेक्शन के लिए कॉन्फ़िगर किया गया एक कनेक्शन पूल।

हमारे पास टोमकैट के कई उदाहरण हैं और प्रत्येक एक विशिष्ट ओरेकल डीबी से जुड़ता है, लेकिन डेवलपर्स सर्वलेट्स का उत्पादन कर रहे हैं जिन्हें उनमें से किसी एक पर चलाने की आवश्यकता हो सकती है, इसलिए मैं डब्ल्यूएआर कनेक्शन विवरण नहीं चाहता हूं फ़ाइल वे उत्पादित करते हैं, लेकिन उन्हें इसे देखने और जेएनडीआई के माध्यम से उस सर्वर के डेटा स्रोत के साथ प्रदान करने के लिए।


<Resource  name="jdbc/banner" 
       auth="Container" 
      factory="org.apache.commons.dbcp.BasicDataSourceFactory" 
        type="javax.sql.DataSource" 
        driverClassName="oracle.jdbc.OracleDriver" 
        url="jdbc:oracle:thin:@DBan8DB1.example.ac.uk:1522:bde8" 
      username="dbsro" 
      password="verysecret" 
      initialSize="5" 
      maxActive="20" 
      maxIdle="10" 
      removeAbandoned="true" 
      global="jdbc/banner" 
      maxWait="-1"/> 

जाहिर है मैं ojdbc, पूल और DBCP JAR सर्वर पर बिलाव के lib निर्देशिका में मौजूद फ़ाइलें:

बिलाव सर्वरconf/context.xml में मैं निम्नलिखित कोड जोड़ा। यहां ध्यान देने योग्य एक महत्वपूर्ण बिंदु यह है कि type के बजाय "javax.sql.DataSource" का है जो मैंने मूल रूप से सोचा था कि यह होना चाहिए।

अब वेब में आवेदन केWEB-INF/web.xml मैं निम्नलिखित कहा:


<resource-ref> 
     <description>Oracle Banner Datasource</description> 
     <res-ref-name>jdbc/banner</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

और मेरे वेब अनुप्रयोग केservlet-context.xml फ़ाइल में (जहां कभी आप रखना तुम्हारा भिन्न हो सकता है) मैं था इस। इस पूरी फ़ाइल नहीं है, लेकिन एक्सएमएल नाम अंतरिक्ष यहाँ महत्वपूर्ण है, जी भागों के लिए:


<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 


<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/banner" resource-ref="true" /> 

फिर पूरी तरह से योग्य संदर्भ jndi-name="java:comp/env/jdbc/banner" जो आवश्यक हो लग रहा था ध्यान दें। web.xml फ़ाइल के संसाधन-रेफ खंड में क्यों आवश्यकता नहीं है, मुझे कोई जानकारी नहीं है।

यदि किसी के पास इस पर कोई विचार है तो मुझे उन्हें पढ़ने में खुशी होगी।

वैसे, इस URL में मदद मिली: Tomcat6 JNDI data source how-to

सब उसके बाद, कनेक्शन काम किया। तो मैंने अपने कार्य स्टेशन से रक्त, पसीना और आँसू फेंक दिया और एक स्वादिष्ट कप ताजा कॉफी का आनंद लिया।

+0

इससे मुझे बहुत मदद मिली! –

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