2012-10-02 11 views
11

मेरा आवेदन शुरू करने पर, मुझे लगभग एक दर्जन या उससे अधिक कार्यों के लिए o.s.aop.framework.Cglib2AopProxy 'Unable to proxy method [public final void org.springframework.jdbc.core.support.JdbcDaoSupport.setDataSource(javax.sql.DataSource)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.' के साथ कई चेतावनियां मिलती हैं।स्प्रिंग एप्लिकेशन में Cglib2AopProxy चेतावनियां हैं

अब मैं पूरी तरह से समझता हूं कि प्रॉक्सी-आधारित पहलुओं को अंतिम तरीकों पर लागू नहीं किया जा सकता है। हालांकि, मैंने (उद्देश्य पर, कम से कम) JdbcDaoSupport में किसी भी पहलू को बुनाई करने की कोशिश नहीं की थी। मुझे संदेह है कि यह <tx:annotation-driven /> से आता है। क्या इन चेतावनियों को चुप करने के लिए मैं कुछ भी कर सकता हूं या बेहतर, उन वर्गों को पहलू बुनाई से बाहर कर सकता हूं?

उत्तर

2

शायद आपने JdbcDaoSupport बढ़ाया है और @Transactional एनोटेशन जोड़ा है।

चेतावनी संदेशों से बचने के लिए आप Cglib2AopProxy लॉग स्तर ERROR पर लॉगर सेट कर सकते हैं। उदाहरण के लिए log4j और log4j.properties का उपयोग कर यदि:

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR 
+4

इसे इस तरह से शांत करना थोड़ा बहुत ही विशिष्ट है। खुद में चेतावनी काफी उपयोगी हो सकती है। –

13

यह सबसे अधिक संभावना @Transactional एनोटेशन के कारण होता है, वसंत लेन-देन संबंधी व्यवहार को जोड़ने के लिए एक प्रॉक्सी में अपने डीएओ गिर्द घूमती है।

मैं अपने डीएओ एक अंतरफलक को लागू करने के लिए सिफारिश करेंगे (बनाते हैं और अपने डीएओ के लिए एक इंटरफेस का उपयोग करें), इस वसंत बजाय CGLib उपयोग करने के लिए होने का एक JDK गतिशील प्रॉक्सी का उपयोग करने की अनुमति देगा।

CGLIB का उपयोग करते हुए एक सीमा यह है कि तरीकों अंतिम लक्ष्य के रूप में चिह्नित कक्षा में सलाह नहीं दी जा सकती है के रूप में अंतिम तरीकों ओवरराइड नहीं किया जा सकता है (CGLIB कार्यावधि में लक्ष्य वर्ग का एक उपवर्ग बनाता है) लेकिन इस सीमा के मामले में गायब हो जाता है जेडीके गतिशील प्रॉक्सी का उपयोग करना।

Reference

+2

प्रश्न में बताए गए अनुसार, मुझे प्रॉक्सी समस्या के बारे में काफी जानकारी है। हालांकि, मैं कहीं भी 'JdbcDaoSupport' का उपयोग नहीं करता हूं। मेरे सभी भंडार (एक को बचाएं) स्प्रिंग डेटा का उपयोग करें और इस प्रकार वैसे भी इंटरफेस होना चाहिए। मुझे शोध करना है कि शेष एक अपराधी या स्प्रिंग डेटा स्वयं है या शायद कस्टम कार्यान्वयन जो उनमें से एक को बढ़ाता है। –

1

आप निर्भरता इंजेक्शन के लिए इंटरफेस का उपयोग करना चाहिए, इस के लिए सबसे अधिक कारणों here और here वर्णित हैं।

विवरण के लिए आप documentation about proxying mechanic पढ़ सकते हैं कि आप यह चेतावनी क्यों देखते हैं।

और feature request of inspection for IntelliJ के लिए वोट दें जो हमें इस चेतावनियों से बचने में मदद कर सकता है। बीटीडब्ल्यू में यह एक अच्छी व्याख्या भी शामिल है।

+2

मैं इस बात से सहमत नहीं हूं कि "आप निर्भरता इंजेक्शन के लिए इंटरफेस का उपयोग करना चाहिए", और आपके द्वारा उद्धृत संदर्भ 2012 से हैं। –

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