2009-09-23 19 views
7

कोई विचार क्यों मुझे यह अपवाद मिल रहा है?वसंत - बीन निर्माण में अजीब त्रुटि

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myService' defined in class path resource [context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO': no matching editors or conversion strategy found 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:499) 
    ... 36 more 
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO': no matching editors or conversion strategy found 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:386) 
... 62 more 

उत्तर

18

मुझे लगता है कि आपको यह त्रुटि नहीं होती है, तो ProdMiscDAO एक अंतरफलक था (यह क्या है?)। मेरा मानना ​​है कि आपके पास शायद एक ऐसी कक्षा है जो हुड के तहत सीजीएलआईबी का उपयोग करके प्रॉक्सी कर रही है, जादू कर रही है, आदि और अंत में इसे एक सेटर या कन्स्ट्रक्टर में सुरक्षित रूप से नहीं रखा जा सकता है। एक इंटरफेस में प्रोग्रामिंग आज़माएं और देखें कि क्या त्रुटि दूर हो गई है।

अद्यतन: ProdMiscDAO एक इंटरफ़ेस नहीं है। यह एक कक्षा है जो SqlMappedClientDaoSupport फैली हुई है।

यह देखते हुए, मैं इस प्रयास करने की अनुशंसा:

  1. SqlMappedProdMiscDAO को ProdMiscDAO का नाम बदलें।
  2. SqlMappedProdMiscDAO से एक अंतरफलक निकालें नामित ProdMiscDAO (जैसे, "class SqlMappedProdMiscDAO implements ProdMiscDAO")
  3. अपने सभी कोड SqlMappedProdMiscDAO का उपयोग करता है के माध्यम से जाओ और ProdMiscDAO उपयोग करने के लिए इसे बदल।
  4. SqlMappedProdMiscDAO को तुरंत चालू करने के लिए वसंत को कॉन्फ़िगर करें, इसे सभी कक्षाओं को तारों की आवश्यकता है।

यह आपके डीएओ कार्यान्वयन को अभी भी SqlMappedClientDaoSupport का विस्तार करने की अनुमति देता है लेकिन एक इंटरफेस भी है। कक्षा के बजाय इंटरफ़ेस का उपयोग करने के लिए सभी वर्गों पर स्विच करने के बाद, स्प्रिंग को आपके डीएओ को प्रॉक्सी करने के लिए cglib का उपयोग नहीं करना होगा और त्रुटि दूर जाना चाहिए।

+0

हां यह एक इंटरफ़ेस नहीं है। यह वास्तव में एक वर्ग है जो स्प्रिंग के 'स्क्लमैप क्लाइंटडाओ सपोर्ट' का विस्तार करता है। लेकिन यह तीसरे पक्ष से आ रहा है। क्या इस त्रुटि से बचना संभव है क्योंकि मैं जार को संपादित नहीं कर पाऊंगा :( – peakit

+0

क्या आप ProdMiscDAO से इंटरफ़ेस निकालने नहीं कर सकते हैं? उदाहरण के लिए, आप ProdMiscDAO को SqlMappedProdMiscDAO या SpringProdMiscDAO में बदल सकते हैं, फिर ProdMiscDao नामक एक इंटरफ़ेस निकालें और क्या आपके वर्ग इंटरफ़ेस का उपयोग करते हैं? स्प्रिंग कक्षा को तुरंत चालू करेगी (जो अभी भी SqlMapClientDaoSupport को बढ़ाती है) लेकिन इंटरफ़ेस की अपेक्षा रखने वाले किसी चीज़ को पास करें। – SingleShot

+0

सिंगलशॉट .. मैं इसे आज़मा दूंगा .. लेकिन क्या आप कृपया मुझे और अधिक गहराई से समझा सकते हैं त्रुटि का कारण? मेरा मतलब है कि मुझे यह पूरी तरह से नहीं मिला .. इसके लिए खेद है :) – peakit

4

वसंत लेन-देन, पहलुओं आदि जैसी चीजों को करने के लिए इंटरफेस से रन-टाइम पर उत्पन्न प्रॉक्सी का उपयोग करता है। डीएओ, सेवाओं इत्यादि जैसी वस्तुओं के लिए उचित वसंत मुहावरे एक इंटरफ़ेस से शुरू करना और ठोस कार्यान्वयन बनाना है । एक बार आपके पास यह हो जाने के बाद, आप आवश्यकतानुसार इंटरफ़ेस से प्रॉक्सी उत्पन्न करने के लिए स्वतंत्र हैं।

तो निश्चित रूप से आपके पास एक ठोस डीएओ कार्यान्वयन होगा, और यदि आप चाहें तो SqlMapClientDaoSupport का विस्तार करने के लिए स्वतंत्र है, लेकिन यह भी एक इंटरफ़ेस बनाएं जिससे आपकी विधियां हों।

सुनिश्चित करें कि आपको वास्तव में SqlMapClientDaoSupport का विस्तार करने की आवश्यकता है। यह हो सकता है कि रचना और प्रतिनिधिमंडल जाने का एक बेहतर तरीका है।

+0

duffymo, समस्या यह है कि यह सब सामान किसी तीसरे पक्ष के जार से आ रहा है और मैं कुछ भी संपादित करने में सक्षम नहीं होगा। क्या इस समस्या के आसपास मैं कोई रास्ता प्राप्त कर सकता हूं? – peakit

+0

मैंने सिंगलशॉट के उत्तर को वोट दिया। मुझे लगता है कि कोशिश करने वाली पहली बात है। उसका जवाब उत्कृष्ट है; मैं इसमें सुधार नहीं कर सकता। – duffymo