一,问题
如果直接运行如下代码:
@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(); }; } }
在运行就可以了。