2012-06-25 63 views
2

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

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

方法虽然@mana解释如何解决这个问题,这就是为什么添加@Cacheable伤了你的代码。最近的blog post更详细地解释了这一点,非常值得一读。

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

您没有提供任何特定的错误,但是在这种情况下,您经常会遇到找不到方法的例外情况。 Spring试图调用代理上的getBackLog()方法,但没有一个。

+0

非常感谢,它解决了这个问题。 – pareshverma91

+0

@ pareshverma91如何正确地解决这个问题..很好帮助 –

3

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

如果你真的需要服务器端网页缓存也许使用this Apache Cache Module

+0

只有这个控制器方法调用了很多不同的资源饥饿的其他方法。所以我想缓存这个方法本身。 @Alex答案解决了我的问题。另外我想缓存ModelAndView而不是最终视图,因为拦截器需要添加其他组件。谢谢您的帮助。 – pareshverma91

0

你应该注射服务类在控制器和缓存服务类