2

我已将我的应用程序升级到 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
}

谢谢您的帮助。

4

3 回答 3

4

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

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

您没有提供任何特定错误,但在这种情况下,您经常会遇到方法未找到异常。Spring 尝试调用getBackLog()代理上的方法,但没有。

于 2012-06-25T12:36:39.217 回答
3

您不应该缓存控制器方法本身,而是将调用以创建积压的资源消耗方法。看看这个类似的问题。所做的是为您@Cachable的函数参数和相关的返回值创建一个键值映射。在您的情况下,这将是一个ModelAndView对象。

如果你真的需要服务器端网页缓存,可以使用这个 Apache Cache Module

于 2012-06-25T11:27:05.750 回答
0

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

于 2012-06-25T11:40:05.490 回答