一,問題
如果直接運行如下代碼:
@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(); }; } }
在運行就可以了。