springmvc Cacheable 不設置key


一,問題

如果直接運行如下代碼:

@Cacheable(value="allMenuList")
public List<SysMenu> findAllMenu() {
....
}


會報錯;因為我們沒有設置key

org.springframework.cache.interceptor.SimpleKey cannot be cast to java.lang.

要解決這個問題, 

我們只要設定key的默認生成規則就可以了。

 

二,解決

下面我把完整的配置發出來。

1  spring-redis.xml中,我們配置redis

<!--@Cacheable使用Redis緩存 : spring自己的緩存管理器,這里定義了緩存位置名稱 ,即注解中的value -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<!--可以設置多個bean,緩存不同區域--> <bean class="org.springframework.data.redis.cache.RedisCache"> <constructor-arg name="redisOperations" ref="redisTemplate"></constructor-arg> <constructor-arg name="name" value="allMenuList"></constructor-arg> <constructor-arg name="prefix" value="dbSYS:"></constructor-arg> <constructor-arg name="expiration" value="600"></constructor-arg> </bean> </set> </property> </bean>

 

2  applicationContext.xml中開啟緩存

<!-- 啟動緩存 -->
<cache:annotation-driven />

 

3 創建redis的配置類

添加生成規則

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Override
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
}

 

在運行就可以了。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM