八年開發程序員淺析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 的報錯日誌中查找問題所在是很是有用的,大部分的錯誤,日誌都會給你反饋。翻譯

若是本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫做的動力。日誌

相關文章
相關標籤/搜索