2012-07-04 23 views
17

मैं इस Autowire के साथ एक परेशानी है के लिए autowire उम्मीदवार के रूप में उत्तीर्ण:स्प्रिंग की उम्मीद कम से कम 1 सेम जो इस निर्भरता

@Service @Transactional 
public class ChiusuraProvider extends ThreadProvider { 


    public void run() {} 
} 

कि फैली

public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean { 
... 
} 
: इस सेम के साथ

@Controller 
public class ChiusuraController { 

    @Autowired 
    private ChiusuraProvider chiusuraProvider; 
} 

मुझे यह त्रुटि मिलती है:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chiusuraController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cinebot.service.ChiusuraProvider com.cinebot.web.controller.ChiusuraController.chiusuraProvider; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cinebot.service.ChiusuraProvider] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

मैंने देखा कि अगर मैं हटा देता हूं तो मुझे यह त्रुटि नहीं मिली है, तो ऑटोवॉयर क्लास के थ्रेडप्रोवाइडर को विस्तारित करता है, लेकिन मुझे वास्तव में थ्रेडप्रोवाइडर अमूर्त वर्ग की आवश्यकता है।

उत्तर

19

यदि थ्रेडप्रोवाइडर पदानुक्रम में कहीं भी कोई इंटरफ़ेस है, तो इंटरफ़ेस का नाम आपके सेवा प्रदाता के प्रकार के रूप में डालने का प्रयास करें, उदाहरण के लिए। अगर आप कहते हैं कि इस संरचना:

public class ThreadProvider implements CustomInterface{ 
... 
} 

फिर अपने नियंत्रक में इस प्रयास करें:

@Controller 
public class ChiusuraController { 

    @Autowired 
    private CustomInterface chiusuraProvider; 
} 

कारण है कि इस है क्या हो रहा है, अपने पहले मामले में आप नहीं था जब ChiusuraProvider शायद ThreadProvider वसंत का विस्तार आपके लिए एक CGLIB आधारित प्रॉक्सी बनाने के लिए अंतर्निहित था (@Transaction को संभालने के लिए)।

जब आप यह सोचते हैं कि ThreadProvider कुछ इंटरफेस फैली ThreadProvider से विस्तार किया है, वसंत उस मामले में एक जावा गतिशील प्रॉक्सी आधारित प्रॉक्सी, जो बजाय ChisuraProvider प्रकार के होने का है कि इंटरफ़ेस के एक कार्यान्वयन प्रतीत होता बनाता है।

आप पूरी तरह ChisuraProvider उपयोग करने के लिए आप एक विकल्प के रूप AspectJ कोशिश या ThreadProvider साथ मामले में CGLIB आधारित प्रॉक्सी के लिए मजबूर भी इस तरह से कर सकते हैं की जरूरत है:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

यहाँ स्प्रिंग संदर्भ से इस पर कुछ अधिक संदर्भ है साइट: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb

+0

क्या होगा यदि मेरी कक्षा एकाधिक इंटरफ़ेस लागू करती है? – user1050619

+0

रुको ... आपने बस अपना जीवन बचाया। मैंने एनोटेशन संस्करण @EnableAspectJAutoProxy (proxyTargetClass = true) का उपयोग किया। धन्यवाद! –

7

आप अपने आवेदन के संदर्भ में इस लाइन रखना चाहिए:

<context:component-scan base-package="com.cinebot.service" /> 

Read more about Automatically detecting classes and registering bean definitions in documentation

+0

मैंने इस लाइन को जोड़ा जहां ChiusuraProvider पैकेज com.cinebot.service में शामिल है और थ्रेडप्रोवाइडर उस पैकेज में शामिल नहीं है ... लेकिन यह काम नहीं करता है। – Tobia

+0

क्या आपने @ बिजूकुंजजमेन के उत्तर की कोशिश की थी (एओपी स्कॉप्ड प्रॉक्सी का उपयोग करके, CGLIB निर्भरता को जोड़ना याद रखें)? – Xaerxess