Spring @Cacheable打破了@RequestMapping

时间:2012-06-25 10:47:21

标签: spring caching ehcache

我已将我的应用程序升级到Spring 3.1,所有的jar都已经充分更新。但是当我尝试在我的一个控制器中使用@Cacheable方法时,该控制器的所有方法的URL映射都会中断。在检查日志文件时,我发现从未检测到该控制器的所有方法的URL映射。我很确定我的缓存配置很好。 任何人都可以给我一些线索,因为我可能做错了。

ehcache.xml中

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache
eternal="false"
maxElementsInMemory="2" 
overflowToDisk="false" 
diskPersistent="false" 
timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />

<cache name="Backlog"  
eternal="false"
maxElementsInMemory="2" 
overflowToDisk="false" 
diskPersistent="false" 
timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />
</ehcache>

配置:

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager">
        <ref bean="ehcache" />
    </property>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="/WEB-INF/spring-configuration/ehcache.xml" />

代码段:

@RequestMapping("/*/backlog")
@Cacheable(value = "Backlog")
public ModelAndView getBackLog(){ 
    //sth here
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

虽然@mana已经解释了如何解决这个问题,但这就是为什么添加@Cacheable会破坏您的代码。最近的blog post更详细地解释了这一点,非常值得一读。

默认情况下,Spring创建JDK动态代理以实现缓存行为,这要求被代理的类实现一个接口,该接口声明您希望在@Cacheable类上公开的所有方法。值得注意的是,如果将Spring配置为使用基于CGLIB的代理,则不必实现任何接口。

您尚未提供任何特定错误,但在此方案中通常会遇到找不到方法的方法。 Spring尝试在代理上调用getBackLog()方法,但没有一个方法。

答案 1 :(得分:3)

您不应该缓存控制器方法本身,而是应该调用资源饥饿方法来创建积压。看看at this similar question@Cachable的作用是为函数参数和相关的返回值创建键值映射。在您的情况下,这将是ModelAndView对象。

如果您确实需要服务器端网页缓存,请使用this Apache Cache Module

答案 2 :(得分:0)

您应该将服务类注入控制器并缓存服务类上的方法