2010-11-12 13 views
5

मैं आज के रूप में ग्लासफ़िश 3.1-स्नैपशॉट चला रहा हूं (2010-11-12)।पीयू निर्दिष्ट होने पर त्रुटियों को "एक निरंतरता इकाई को हल नहीं किया जा सका ..."

मैं एम्बेडेड EJBContainer का उपयोग कर रहा हूं।

classpath पर, के रूप में EJBContainer द्वारा रिपोर्ट, मैं एक META-INF/persistence.xml है। यह फ़ाइल दो दृढ़ता इकाइयों को परिभाषित करती है: जिसे "एनजीपी" कहा जाता है और जिसे "सीएक्स" कहा जाता है।

डिबगिंग आउटपुट पता चलता है कि Glassfish जेपीए deployer यह पाता है, और दोनों cx पीयू और NGP पीयू को पहचानता है।

निम्नलिखित सभी के लिए भी आम जेपीए त्रुटि के साथ बाहर EJBContainer बम:

java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [cx] in the scope of the module called [/Users/ljnelson/Projects/foo/target/test-classes/]. Please verify your application. 
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:693) 
at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:910) 
at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:140) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:869) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:193) 
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:142) 
at org.glassfish.ejb.embedded.EJBContainerImpl.deploy(EJBContainerImpl.java:135) 
at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createEJBContainer(EJBContainerProviderImpl.java:132) 
at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:127) 

मैं फिर से तनाव है कि तैनाती लॉग पता चलता है कि कम से कम deployer का सामना करना पड़ता दोनों दृढ़ता इकाइयों।

वर्ग "cx" का उपयोग करना चाहता है कि पीयू सामान्य बॉयलरप्लेट शामिल हैं:

@PersistenceContext(unitName="cx") 
private EntityManager em; 

persistence.xml (सामान्य Maven जगह) target/test-classes/META-INF में मौजूद है और इस तरह दिखता है:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="cx" transaction-type="JTA"> 
     <jta-data-source>java:global/jdbc/H2Test</jta-data-source> 
     <!-- snip --> 
    </persistence-unit> 

    <persistence-unit name="ngp" transaction-type="JTA"> 
     <jta-data-source>java:global/jdbc/H2Test</jta-data-source> 
     <!-- snip --> 
    </persistence-unit> 

</persistence> 

Glassfish एम्बेडेड EJBContainer, जबकि इसके काम कर रही है, इस आउटपुट:

Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: Got [email protected] 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With attribute name 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With value cx 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor method setName with cx 
...snip... 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: Got [email protected] 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With attribute name 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With value ngp 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor method setName with ngp 

समस्या निवारण व्यंजनों, कोई भी?

+0

मुझे जिक्र करना चाहिए कि मैं जेटीए - कंटेनर प्रबंधित लेनदेन का उपयोग कर रहा हूं - दोनों पीयू में। यह मेरे लिए होता है कि एक्सए यहां एक आवश्यकता होगी। क्या यह तथ्य होगा कि मेरे परीक्षण डेटा स्रोत XA अनुपालन इस त्रुटि के कारण नहीं हैं? –

+0

एक्सए का उपयोग करने के लिए डेटा स्रोत अपडेट किया गया; कोई प्रभाव नहीं। –

+0

क्या डेटा स्रोत XA हैं या इससे कोई फर्क नहीं पड़ता है, कम से कम अब नहीं (बाद में यदि आप एक ही समय में दोनों ईएम का उपयोग करने का निर्णय लेते हैं लेकिन यह एक और कहानी है)। क्या यह केवल एक पीयू के साथ काम करता है? –

उत्तर

5

यह एक अजीब व्यवहार और पायलट त्रुटि का संयोजन है।

सबसे पहले, पायलट त्रुटि।

विशेष JUnit परीक्षण का मामला मैं देख रहा था एक सहयोगी का था, और जैसे कि यह एक EJB ही ​​थे, हमारी आंतरिक नामकरण परंपरा निम्नलिखित यह नामित किया गया था। यह शायद मेरे सहयोगी के हिस्से पर एक कट और पेस्ट त्रुटि है।

मुझे लगता है कि क्योंकि हर बार जब मैं फ़ाइल को खोला मैं इसे इस तरह से घूरे है जैसे कि यह अपने आप में एक EJB थे उल्लेख।

लेकिन निश्चित रूप से यह एक ईजेबी नहीं है।

हालांकि, रहस्यमय रूप से, वहां @PersistenceContext एनोटेशन है, और EntityManager है, जो अप्रयुक्त है। दृढ़ता संदर्भ में एक विशेषता है - आपने अनुमान लगाया - unitName="cx"

तो अजीब व्यवहार वर्ष EJB कंटेनर, जो इस परीक्षण का मामला भाग गया ठीक है, और अब, EJB कंटेनर @PersistenceContext इंजेक्शन के लिए एक वैध लक्ष्य के रूप में इस गैर EJB, गैर विशेष वर्ग के इलाज के लिए शुरू किया के बीच में है कि कहीं न कहीं है। शायद इस टेस्ट केस को एक प्रबंधित बीन के रूप में माना जा रहा है, लेकिन मैं इस धारणा के तहत था कि गैर-सीडीआई पर्यावरण में प्रबंधित बीन्स को इस तरह एनोटेट किया जाना था।

किसी भी तरह, एक बार मैं इस नकली @PersistenceContext एनोटेशन हटा दिया, सब कुछ ठीक काम किया।

+0

यह समस्या का एक बड़ा हिस्सा बताता है। हालांकि, जीएफ 3.0.1 और जीएफ 3.1 के बीच परिवर्तन वास्तव में अजीब है (और कहीं भी एक बग हो सकता है)। क्या आपका संग्रह भी सीडीआई सक्षम है (क्या इसमें बीन्स.एक्सएमएल है)? –

+0

नहीं, यह जानबूझकर सीडीआई-सक्षम नहीं है, क्योंकि ग्लासफ़िश के पास अतीत में सीडीआई के साथ सभी तरह की भयानक समस्याएं थीं। –

4

यदि गलती से आप @PersistenceContext (name = "cx") को @PersistenceContext (unitName = "cx") के बजाय डालते हैं तो आपको वही त्रुटि मिलती है जो काम कर रही है।

+1

एसओ में आपका स्वागत है। भविष्य के संदर्भ के लिए आपको अधिक विस्तृत और पूर्ण उत्तर देने पर विचार करना चाहिए, अन्यथा आप डाउनवॉट/फ्लैगग्रेड हो सकते हैं। :) हैप्पी कोडिंग। –

+1

अनुमोदित, जवाब थोड़ा छोटा है, लेकिन यह मेरी समस्या का समाधान था। –