2011-10-28 84 views
1

我使用Spring 3.0和ehcache。我已將@Cacheable註釋添加到bean的某些方法。我將該注入到其他bean中,並將其註冊到我的應用程序上下文xml文件中。應用程序在添加ehcache註釋之前工作(我使用com.googlecode.ehcache-spring-annotations v 1.2.0),但是在添加註釋之後,Spring無法正確注入包含註釋的bean。我在日誌文件中看到的錯誤是:使用ehcache的Bean不能注入

org.springframework.beans.ConversionNotSupportedException:無法轉換'$ Proxy67類型的屬性值實現java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework .aop.framework.Advised'爲屬性'{property}'的必需類型'{my bean type}'。

以下是我已經添加到我的應用程序上下文的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> 

我認爲配置是OK的,因爲一開始我還有些問題加載ehcache.xml中的文件,並有一個相應的日誌中的錯誤。解決問題後,我得到了上述錯誤。看起來Spring會爲我的bean創建一個代理,它在內部調用ehcache的緩存邏輯,但無法將該代理轉換爲bean類型。

+1

具有'@ Cacheable'註釋的Bean是否有接口,並且您使用接口還是緩存的注入的其他bean中的類? – Ralph

+0

無論如何:如果我沒有記錯,那麼'@ Cacheable'支持是Spring 3.1的一個特性,在3.0中不支持。確保你不使用'javax.persistance.Cacheable'! – Ralph

+0

@Ralph,我確定我使用了正確的'@ Cacheable'註解。我剛剛與一些同事討論過這個問題,你的第一個評論可能會指出正確的答案。我使用具體類來注入bean,而Spring似乎將代理綁定到接口。 –

回答

2

見春(3.1)參考:第一章27. Cache Abstraction

在您的配置,您使用的,接口基本代理。 因此,使用緩存方法的Bean的Bean必須引用其接口,而不是其具體類。

或者您可以更改配置proxy-target-class="true"以使用基於類的代理。

+0

是的,確實使用接口解決了我的問題。我很樂意使用Spring的新版本,很遺憾,我們不能在項目開發過程中考慮改變技術。感謝您的快速回答。 –