2011-10-28 3 views
1

나는 Spring 3.0과 ehcache를 사용한다. 빈의 일부 메소드에 @Cacheable 주석을 추가했습니다. 나는 그 빈을 다른 빈에 주입하고 있는데 이것은 내 응용 프로그램 컨텍스트 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 파일을로드하는 몇 가지 문제를 가지고 있었고, 거기 때문에 그에 대한 로그의 해당 오류. 문제를 해결 한 후에 위의 오류가 발생했습니다. 봄은 ehcache를위한 캐싱 로직을 내부적으로 호출하는 빈에 대한 프록시를 생성하지만, 그 프록시를 빈 타입으로 변환 할 수 없다.

+1

'@ Cacheable' Annotation이있는 Bean에는 인터페이스가 있고 캐시 된 것이 삽입 된 다른 bean의 인터페이스 나 클래스를 사용합니까? – Ralph

+0

어쨌든 : 내가 기억한다면'@ Cacheable' 지원은 3.0에서 지원되지 않는 Spring 3.1 기능입니다. 당신이'javax.persistance.Cacheable'을 사용하지 않는 것을 확인하십시오! – Ralph

+0

@Ralph, 올바른 '@ Cacheable'주석을 사용하고 있는지 확신합니다. 방금 일부 동료와 문제를상의했으며 첫 번째 의견은 올바른 대답을 가리킬 것입니다. 콩을 주입하기 위해 구체적인 클래스를 사용하는 반면, 스프링은 프록시를 인터페이스에 바인딩하는 것으로 보인다. –

답변

2

참조 봄 (3.1) 참조 : 장 구성에서 27. Cache Abstraction

, 당신은, 인터페이스 기본 프록시를 사용하고 있습니다. 그래서 캐시 된 메소드와 함께 Bean을 사용하는 Bean은 구체적인 클래스가 아니라 해당 인터페이스를 참조해야합니다.

또는 proxy-target-class="true" 구성을 변경하여 클래스 기반 프록시를 사용할 수 있습니다.

+0

예, 실제로 인터페이스를 사용하여 내 문제를 해결했습니다. 불행히도 새로운 버전의 Spring을 사용하게되어 기쁩니다. 프로젝트 개발 중간에 기술 변경을 고려할 수 없습니다. 빠른 답변 주셔서 감사합니다. –

관련 문제