八年开发程序员浅析SpringBoot 之 Shiro 与 Redis 多级缓存问题

前言

来自不肯意透露姓名的小师弟的投稿。这篇主要讲了,项目中配置了多缓存遇到的坑,以及解决办法。java

发现问题

在一次项目实践中有实现多级缓存其中有已经包括了 Shiro 的 Cache ,本觉得开启 redis 的缓存是一件很简单的事情只须要在启动类上加上 @EnableCaching 注解就会启动缓存管理了,可是问题出现了。redis

重要错误日志截图

java.lang.IllegalStateException: @Bean method ShiroConfig.cacheManager called as a bean reference for type [org.apache.shiro.cache.ehcache.EhCacheManager] but overridden by non-compatible bean instance of type [org.springframework.data.redis.cache.RedisCacheManager]. Overriding bean of same name declared in: class path resource [org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.class]spring

错误日志分析

看日志大概就发现一个非法状态异常,咱们继续查看接下来的日志有一段很是的重要日志 Overriding bean of same name 翻译过来的意思是帮你重写了一个名字同样的 Bean,我再看看日志里有提到 RedisCacheManager 与我本身实现的 cacheManager 到这里我已经感受到问题所在了,如下图一为 RedisCacheManager 部分实现代码。图二为我本身的 Shiro 的 cacheManager 实现方法。apache

解决问题 有 Spring 基础的你们都应该还记得 Spring 不容许有相同的 Bean 出现。如今问题就在于 Redis 缓存管理器和 Shiro 的缓存管理器重名了,而这两者又是经过 Spring 管理,因此 Spring 读取这两者的时候,产生冲突了。解决问题的方法很简单:在本身实现 EhCacheManager 时把 @Bean 指定一个名字能够像这样 @Bean(name ="ehCacheManager" ),还有其余办法你们能够在想办法实现一下嘿嘿。缓存

结语

虽然咱们都知道 Spring 的报错是很是多的,可是在 Spring 的报错日志中查找问题所在是很是有用的,大部分的错误,日志都会给你反馈。翻译

若是本文对你哪怕有一丁点帮助,请帮忙点好看。你的好看是我坚持写做的动力。日志

相关文章
相关标签/搜索