2010-04-10 38 views
5

मुझे एक अजीब त्रुटि संदेश दिखाई दे रहा है और समस्या के बारे में कुछ विचारों की तलाश में हूं। मैं जेपीए का उपयोग करने के लिए नया हूं।ब्रेनस्टॉर्मिंग: अजीब जेपीए समस्या, संभवतः क्लासपाथ या जार संस्करण समस्या?

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

जब मैं इस एप्लिकेशन को ग्लासफ़िश पर तैनात करता हूं, तो एप्लिकेशन अपेक्षा के अनुसार काम करता है।

समस्या यह है कि मैंने ग्लासफ़िश के बाहर चलाने के लिए अकेले स्टैंड यूनिट परीक्षणों का एक सेट बनाया है जो सही तरीके से काम नहीं कर रहे हैं। मैं निम्न त्रुटि (मैं कक्षा के नाम एक छोटे से संपादित किया है)

com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity 

वस्तु एक ही प्रकार के एक वर्ग में ढाला नहीं जा सकता है? ऐसे कैसे हो सकता है?

यहाँ कोड गलती से हुआ है कि का एक टुकड़ा है

Query q = entityManager.createNamedQuery("MyEntity.findAll"); 
List entityObjects = q.getResultList(); 
for (Object entityObject: entityObjects) { 
    com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject; 

इससे पहले, मैं इस कोड है कि एक ही त्रुटि का उत्पादन किया था:

CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery(); 
cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class)); 
List entityObjects = entityManager.createQuery(cq).getResultList(); 
for (Object entityObject: entityObjects) { 
    com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject; 

इस कोड सवाल यह है कि एक ही है मेरे पास है सर्वर पर तैनात

यहाँ अंतरतम अपवाद है अगर यह मदद करता है

Caused by: java.lang.ClassCastException: com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity 
    at com.xyz.abc.services.persistence.entity.factory.MyEntityFactory.createBeans(MyEntityFactory.java:47) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115) 
    ... 37 more 

मेरा अनुमान है कि कुछ जार Glassfish में उपयोग किया जा रहा है कि लोगों को मैं परीक्षा में उपयोग कर रहा हूँ से अलग है यह है कि। मैंने "जार" के रूप में सूचीबद्ध सभी जारों को देखा है और मुझे यकीन है कि वे ग्लासफ़िश से सभी समान हैं।

मुझे बताएं कि क्या आपने पहले यह अजीब मुद्दा देखा है, या इसे ठीक करने के लिए कोई विचार है।

उत्तर

5

यह कक्षा लोडिंग समस्या भी हो सकती है। दो अलग-अलग वर्ग लोडर द्वारा लोड की गई एक ही कक्षा परिभाषा को जेवीएम द्वारा विभिन्न वर्गों के रूप में देखा जाता है।

आप इस कोशिश कर सकते खेल में वर्ग लोडर के बारे में जानकारी प्राप्त करने के लिए:

Query q = entityManager.createNamedQuery("MyEntity.findAll"); 
List entityObjects = q.getResultList(); 

ClassLoader loader1 = 
    com.xyz.abc.services.persistence.entity.MyEntity.getClass().getClassLoader(); 
System.out.println("MyEntity's class loader is " + loader1); 
for (Object entityObject: entityObjects) { 
    ClassLoader loader2 = entityObject.getClass().getClassLoader(); 
    System.out.println("Class loader of entity " + entityObject + " is " + loader2); 
} 

के बजाय System.out.println आप निश्चित रूप से उपयोग अपनी पसंद के प्रवेश ढांचे के लिए कॉल कर सकते हैं।

यहां कक्षा लोडिंग के बारे में अधिक जानकारी के साथ a series of articles है।

+0

हाँ ठीक है, यह एक मुद्दा प्रतीत होता है। MyEntity की क्लास लोडर है [email protected] MyEntity वस्तु की क्लास लोडर है org.springfr[email protected]16089a5 अब इसे ठीक करने ???: यहाँ उत्पादन होता है मैं उन लेखों में खोदने जा रहा हूं जिन्हें आपने लिंक किया था। – Vinnie

+1

@ विनी दुर्भाग्य से मैं आपके द्वारा उपयोग किए जाने वाले टूल से परिचित नहीं हूं, इसलिए मैं अधिक ठोस सहायता प्रदान नहीं कर सकता। शुभकामनाएं - आपको इसकी आवश्यकता होगी ... –

+1

ठीक है, यह शायद एक रूकी गलती है, लेकिन आपका सुझाव (और स्थानीय स्तर पर विभिन्न क्लासलोडर्स का उपयोग करने के बारे में रहस्योद्घाटन) ने एक व्यावहारिक समाधान का नेतृत्व किया। यह देखते हुए कि खेल में अलग-अलग क्लासलोडर थे, मुझे लगता है कि स्प्रिंग के लोकल कॉन्टेनेर एंटीटी मैनेजर फैक्ट्रीबीन मेरे यूनिट परीक्षणों के दौरान उपयोग करने का सही विकल्प नहीं था। मैं LocalEntityManagerFactoryBean पर स्विच किया (जिसका अर्थ यह भी था कि मुझे एक नई दृढ़ता इकाई की आवश्यकता है क्योंकि मैं डेटासोर्स इंजेक्ट नहीं कर सका) और चीजें अब स्थानीय रूप से काम कर रही हैं। सहायता के लिए धन्यवाद! – Vinnie

1

यह स्पष्ट रूप से ClassLoader समस्या (शायद ग्रहण लिंक्स द्वारा आवश्यक बुनाई के कारण) की गंध करता है। क्या आप LoadTimeWeaver का उपयोग करते हैं? क्या आपके पास कोई जावा सामग्री कॉन्फ़िगर की गई है? क्या मेवेन के नीचे कमांड लाइन पर समस्या आती है? आपके आईडीई में? कृपया स्पष्ट करें।

+0

बुनाई के बारे में अच्छा बिंदु, मेरा मतलब इस सवाल में उल्लेख करना था। मैं org.springframework.context.weaving.DefaultContextLoadTimeWeaver का उपयोग कर रहा हूं ग्लासफ़िश और org.springframework.instrument.classloading.SimpleLoadTimeWeaver मेरे परीक्षणों में। मुझे यकीन नहीं था कि किस का उपयोग करना है, इसलिए मैंने बस एक ऐसा काम किया जो काम करने लग रहा था। – Vinnie

+0

बीटीडब्ल्यू - मेरे पास कोई जावाजेंट कॉन्फ़िगर नहीं है। और समस्या मेवेन कमांड लाइन से भी होती है, साथ ही आईडीई से भी होती है। ग्लासफ़िश सर्वर एकमात्र ऐसा क्षेत्र है जहां मुझे समस्या दिखाई नहीं दे रही है। – Vinnie

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