2011-03-17 7 views
8

मैं एक करफ ओएसजीआई कंटेनर के अंदर चलाने के लिए एक WAR फ़ाइल प्राप्त करने का प्रयास कर रहा हूं। आवेदन स्टैंड-अलोन जेट्टी 6.1.26 में सही ढंग से चलाता है, लेकिन जब आवेदन Karaf के अंदर चलाया जाता है, मैं निम्नलिखित अपवाद और Karaf उदाहरण जमा मिलती है:नाइस खेलने के लिए स्प्रिंग जेपीए, हाइबरनेट और ओएसजीआई कैसे प्राप्त करें?

WARN org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find 
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null 

ध्यान दें कि आवेदन हाइबरनेट पर भरोसा नहीं कर रहा है एक अलग ओएसजीआई बंडल में; इसमें वेब-आईएनएफ/lib में हाइबरनेट जार शामिल हैं।

मैंने इस पोस्ट की जानकारी की जांच की है: Equinox (OSGi) and JPA/Hibernate - Finding Entities। हालांकि, एप्लिकेशन सीधे हाइबरनेट का उपयोग करने के बजाय जेपीए का उपयोग कर रहा है। एप्लिकेशन की कॉन्फ़िगरेशन इस पोस्ट में मिले दूसरे विकल्प की तरह है: Difference between configuring data source in persistence.xml and in spring configuration files। इस प्रकार, मेरे पास एक हाइबरनेट सत्र फ़ैक्टरी पर एक संभाल नहीं है जो मुझे एनोटेटेड क्लास संपत्ति सेट करने की अनुमति देता है।

अपवाद को दूर करने के तरीके पर कोई विचार?

उत्तर

4

मैंने लेखक के साथ समानांतर में काम किया और मैं भविष्य में इस में चलने वाले किसी भी व्यक्ति के लिए अपना समाधान यहां पोस्ट करूंगा।

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

हमने persistence.xml फ़ाइल और orm.xml फ़ाइल का उपयोग किया था (हमने डिफ़ॉल्ट नामों का उपयोग किया था, इसलिए हमें हमारे applicationContext.xml में निर्दिष्ट करने की आवश्यकता नहीं थी)।

हमारी persistence.xml फ़ाइल टैग का उपयोग कर orm.xml पर बस इंगित की गई। इसमें अतिरिक्त कक्षाओं को लोड करने की कोशिश करने से हाइबरनेट को रखने के लिए <exclude-unlisted-classes/> टैग भी शामिल है।

हमारी orm.xml फ़ाइल ने प्रत्येक इकाई वर्ग को कॉल करने के लिए <entity class="path.to.my.class" metadata-complete="false"/> का उपयोग किया था जिसे हमें लोड करने के लिए आवश्यक था। metadata-complete भाग कॉन्फ़िगरेशन को पूरा करने के लिए कक्षा में पाए गए एनोटेशन का उपयोग करने के लिए हाइबरनेट को बताता है।

+1

स्प्रिंग जेपीए persistence.xml फ़ाइल के उदाहरण के लिए, देखें [वसंत फ्रेमवर्क संदर्भ मैनुअल की धारा 12.6.1.3] (http://static.springsource.org/spring/docs/2.5.x/reference/ orm.html) इस समाधान के लिए, orm.xml फ़ाइल में केवल ' 'तत्व और एक नेस्टेड' 'तत्व शामिल है जिसमें प्रत्येक श्रेणी के पूर्ण-योग्य क्लास नाम के साथ @ एंटीटी एनोटेशन शामिल है। 'मेटाडाटा-पूर्ण =" झूठी "विशेषता विशेषता क्लास में निर्दिष्ट एनोटेशन से orm.xml फ़ाइल (सब कुछ, इस मामले में) में निर्दिष्ट सभी डेटा को पढ़ने के लिए हाइबरनेट को बताती है। – Adam

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