मैं स्प्रिंग 3.0 और ehcache का उपयोग करता हूं। मैंने बीन के कुछ तरीकों में @Cacheable एनोटेशन जोड़े हैं। मैं उस बीन को अन्य बीन्स में इंजेक्ट कर रहा हूं और यह मेरे एप्लिकेशन संदर्भ xml फ़ाइल में पंजीकृत है। एप्लिकेशन ehcache एनोटेशन जोड़ने से पहले काम कर रहा था (मैं com.googlecode.ehcache-spring-annotations v 1.2.0 का उपयोग करता हूं), लेकिन एनोटेशन जोड़ने के बाद, स्प्रिंग एनोटेशन वाले बीन्स को ठीक से इंजेक्ट करने में असमर्थ है। मेरी लॉग फ़ाइल में मुझे जो त्रुटि दिखाई दे रही है वह है:

Org.springframework.beans.ConversionNotSupportedException: '$Proxy67 कार्यान्वयन java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' प्रकार के गुण मान को '{my bean' में बदलने में विफल प्रकार}' संपत्ति के लिए '{संपत्ति}'।

काम करने के लिए ehcache के लिए मैंने अपने आवेदन संदर्भ में जो जोड़ा है वह यहां दिया गया है:

<context:annotation-config />
<context:component-scan base-package="{my root package}" />

<ehcache:annotation-driven cache-manager="cacheManager" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml" />
</bean>

मुझे लगता है कि कॉन्फ़िगरेशन ठीक है, क्योंकि पहले मुझे ehcache.xml फ़ाइल लोड करने में कुछ समस्याएँ थीं और उसके लिए लॉग में एक संबंधित त्रुटि थी। समस्या को ठीक करने के बाद, मुझे उपरोक्त त्रुटि मिली। ऐसा लगता है कि वसंत मेरे बीन के लिए एक प्रॉक्सी बनाता है जो आंतरिक रूप से ehcache के लिए कैशिंग तर्क को कॉल करता है, लेकिन उस प्रॉक्सी को बीन प्रकार में परिवर्तनीय बनाने में विफल रहता है।

1
Ivaylo Slavov 28 अक्टूबर 2011, 14:34
1
क्या बीन जिसमें @Cacheable एनोटेशन है, में एक इंटरफ़ेस है, और क्या आप अन्य बीन में इंटरफ़ेस या वर्ग का उपयोग करते हैं जहाँ कैश्ड को इंजेक्ट किया जाता है?
 – 
Ralph
28 अक्टूबर 2011, 14:42
वैसे भी: अगर मुझे सही याद है, तो @Cacheable समर्थन एक स्प्रिंग 3.1 सुविधा है, जो 3.0 में समर्थित नहीं है। सुनिश्चित करें कि आप javax.persistance.Cacheable का उपयोग नहीं करते हैं!
 – 
Ralph
28 अक्टूबर 2011, 14:46
@ राल्फ, मुझे यकीन है कि मैं सही @Cacheable एनोटेशन का उपयोग करता हूं। मैंने अभी कुछ सहयोगियों के साथ इस मुद्दे पर चर्चा की है और आपकी पहली टिप्पणी शायद सही उत्तर की ओर इशारा करती है। मैं बीन को इंजेक्ट करने के लिए कंक्रीट क्लास का उपयोग कर रहा हूं, जबकि स्प्रिंग प्रॉक्सी को एक इंटरफेस से बांधता है।
 – 
Ivaylo Slavov
28 अक्टूबर 2011, 14:53

1 उत्तर

सबसे बढ़िया उत्तर

स्प्रिंग (3.1) संदर्भ देखें: अध्याय 27. कैश एब्स्ट्रैक्शन

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

या आप वर्ग आधारित प्रॉक्सी का उपयोग करने के लिए कॉन्फ़िगरेशन proxy-target-class="true" को बदल सकते हैं।

2
Ralph 28 अक्टूबर 2011, 14:59
हां, वास्तव में एक इंटरफ़ेस का उपयोग करने से मेरी समस्या हल हो गई। मुझे स्प्रिंग के नए संस्करण का उपयोग करने में खुशी होगी, दुर्भाग्य से हम परियोजना विकास के बीच में बदलती तकनीकों पर विचार नहीं कर सकते। त्वरित जवाब के लिए धन्यवाद।
 – 
Ivaylo Slavov
28 अक्टूबर 2011, 15:22