項目中同時使用Redis(lettuce)和Redisson的報錯

溫馨提示:圖片有點小,可以放大頁面進行查看...

問題1:版本沖突

直接上圖,這個錯表示依賴版本不匹配問題,我本地SpringBoot用的是2.7,但是Redisson版本用的3.32.5。

?我們通過點擊 artifactId跟進去

發現它依賴的SpringBoot版本是3.1

?換成3.18.0之后就好了


?大家碰到NotClassDefFoundError ,就優先考慮依賴版本問題,連類定義都沒有,太離譜了...

?問題2:循環依賴

這個錯誤還是很容易就復現出來的...

?這里放大關鍵報錯信息

我在RedisConfig中同時完成RedisTemplate和RedissonClient的初始化。

因為我通過字段注入RedissonConnectionFactory。

當其他類需要redisTemplate的時候,即依賴RedisConfig,去完成Bean注冊的時候發現redisTemplate依賴RedissonConnectionFactory,而RedissonConnectionFactory依賴RedissonClient,而RedissonClient依賴RedisConfig。走了一圈,發現RedisConfig依賴RedisConfig,所以產生了循環依賴。

@Configuration
public class RedisConfig {@Autowiredprivate RedissonConnectionFactory fa;@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private Integer port;@Value("${spring.redis.password}")private String password;@Beanpublic RedisTemplate<String, Object> redisTemplate(RedissonConnectionFactory factory) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.setDefaultSerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}@Beanpublic RedissonClient redissonClient() {Config config = new Config();// redis為單機模式config.useSingleServer().setAddress("redis://" + host + ":" + port);return Redisson.create(config);}
}

眼尖的朋友可能會有疑問,我為什么要將RedissonConnectionFactory作為字段,依賴注入?

其實原代碼用的是RedisConnectionFactory,同時redisTemplate用的RedisConnectionFactory完成的Bean初始化。我在它的基礎上加了個RedissonClient的初始化。

@Configuration
public class RedisConfig {@Autowiredprivate RedisConnectionFactory factory;@Beanpublic RedisTemplate<String, Object> redisTemplate() {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.setDefaultSerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}
}

但其實,我這里不管用RedissonConnectionFactory還是RedisConnectionFactory都是一樣的,最終其實用的都是?RedissonConnectionFactory....

先說答案:因為項目中引入了Redisson框架,因此Spring容器會優先使用RedissonConnectionFactory,因為會優先執行 RedissonAutoConfiguration 文件。

下面是分析過程:

我將字段注入去掉,并且方法參數改成了RedissonConnectionFactory,進行debug

?跟進RedissonConnectionFactory,繼續跟進getConnection方法

?發現這里已經變成了redissonConnection

因為:項目中使用了Redisson,優先初始化RedissonClient,【依賴于RedissonConnectionFactory,所以RedissonConnectionFactory也初始化了】


看一下為什么RedisConnectionFactory會被替換為RedissonConnectionFactory:

?跟進RedisConnectionFactory,它繼承自PersistenceExceptionTranslator

?查看PersistenceExceptionTranslator的引用,發現同時有RedisConnectionFactory和RedissonConnectionFactory兩個Bean

?這里使用的是RedissonConnectionFactory。


解決辦法:

方法1:將字段注入去掉,這樣的話可以打破依賴關系:
RedisConfig - > RedissonConnectionFactroy?

方法2:在啟動類上,添加屬性 exclude ,將RedisAutoConfiguration 排除掉,這樣的話,也是打破了RedisConfig -> RedissonConnectionFactory,改成了依賴RedisConnectionFactory

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72721.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jackson 詳解

目錄 前言 Jackson 是 Java 生態中最流行的 JSON 處理庫之一&#xff0c;廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能&#xff0c;支持注解、模塊化設計和多種數據格式&#xff08;如 XML、YAML&#xff09;。本文將詳細介…

H.264,H.265,H.266標準技術改進

關于H.264,H.265,H.266相關資料鏈接&#xff1a; 標準及中文資料鏈接 視頻編碼中的主要技術 視頻編碼的目標是在保證視頻質量的前提下&#xff0c;盡可能減少數據量。以下是視頻編碼中的核心技術&#xff1a; 塊劃分&#xff08;Block Partitioning&#xff09; 將視頻幀劃分…

clickhouse安裝路徑

《ClickHouse安裝路徑指南》 大家好&#xff0c;今天我們將一起學習如何在電腦上找到和理解ClickHouse的安裝路徑。這將幫助學生、科研人員以及任何對數據庫技術感興趣的人更好地管理他們的數據查詢工作。 ClickHouse是一款列式存儲數據庫管理系統&#xff08;DBMS&#xff09…

時序數據庫 InfluxDB 3.0 版本性能實測報告:寫入吞吐量提升效果驗證

亮點總結&#xff1a; TSBS 測試表明&#xff0c;對于少于 100 萬臺設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入速度實際上比 InfluxDB OSS 1.8 更慢。 對于 100 萬臺及以上設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入性能才開始超過 InfluxDB OSS 1.8。…

AS32X601雙核鎖步MCU技術優勢分析

AS32X601是國科安芯公司研制的一系列基于32位RISC-V指令集車規級MCU處理器芯片。主頻高達180MHz&#xff0c;支持雙核鎖步架構&#xff0c;基于軟錯誤防護技術加持&#xff0c;顯著提高芯片安全性能。產品具有高安全、低失效、多IO、低成本、抗輻照等特點。 一、功能安全與可靠…

基于 LeNet 網絡的 MNIST 數據集圖像分類

1.LeNet的原始實驗數據集MNIST 名稱&#xff1a;MNIST手寫數字數據集 數據類型&#xff1a;灰度圖 &#xff08;一通道&#xff09; 圖像大小&#xff1a;28*28 類別數&#xff1a;10類&#xff08;數字0-9&#xff09; 1.通過torchvision.datasets.MNIST下載并保存到本地…

電池綜合測試儀:科技賦能,精準守護能源安全

在當今這個科技日新月異的時代&#xff0c;電池作為眾多電子設備的心臟&#xff0c;其性能的穩定與高效直接關系到設備的運行質量與使用安全。隨著電動汽車、可穿戴設備、儲能系統等領域的快速發展&#xff0c;對電池性能的檢測與評估提出了更高要求。在此背景下&#xff0c;電…

【Linux 22.4 ubuntu 安裝cuda12.1 完整方案】

下載cuda12.1 官網網址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已經安裝驅動&#xff0c;則不要選擇dirver那項 添加環境變量 vim ~/.b…

實戰案例分享:Android WLAN Hal層移植(MTK+QCA6696)

本文將詳細介紹基于MTK平臺&#xff0c;適配高通&#xff08;Qualcomm&#xff09;QCA6696芯片的Android WLAN HAL層的移植過程&#xff0c;包括HIDL接口定義、Wi-Fi驅動移植以及wpa_supplicant適配過程&#xff0c;涵蓋STA與AP模式的常見問題與解決方法。 1. HIDL接口簡介 HID…

Greenplum6.19集群搭建

一&#xff0c;安裝說明 1.1環境說明 1、首先確定部署的環境&#xff0c;確定下服務器的端口&#xff0c;一般默認是22的端口&#xff1b; 2、當前這份文檔是服務器處于10022端口下部署的&#xff08;現場生產環境要求&#xff0c;22端口在生產環境存在安全隱患&#xff09;&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下&#xff0c;可能會有一些人會惡意訪問當前網站&#xff0c;來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂&#xff0c;出現臟數據&#xff0c;或者造成后端訪問壓力大等問題。 一般要解決這個問題的話&#xff0c;前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件&#xff1a; uniapp-v8-release.aar 2.提供uniapp調用的接口&#xff0c;新建類文件繼承UniModule&#xff0c; package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 &#xff0c;用戶狀態為運行 2: 創建新用戶 命令&#xff1a; adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

前端安全面試題匯總及參考答案

目錄 簡述 XSS 攻擊的原理及三種常見類型(存儲型、反射型、DOM 型) 如何在前端防御 XSS 攻擊?列舉編碼、過濾、CSP 策略的具體實現方式 富文本編輯器場景下如何安全處理用戶輸入的 HTML 內容? 如何通過 HttpOnly 屬性增強 Cookie 安全性?它與 XSS 防御的關系是什么? …

Linux驅動開發(1.基礎創建)

序言&#xff1a;從高層邏輯到底層硬件的回歸 在當今的軟件開發中&#xff0c;我們習慣于用高級語言構建抽象層——通過框架、庫和云服務快速實現功能。這種“軟邏輯”的便利性讓開發效率倍增&#xff0c;卻也逐漸模糊了我們對計算機本質的認知&#xff1a;一切代碼終將落地為…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 純新手教學&#xff0c;手把手5分鐘帶你在本地部署一個私有的deepseek&#xff0c;再也不用受網絡影響。流暢使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超詳細教程 &#xff0…

HTML學習筆記(全)

基本結構 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title></title> </head> <body></body> </html> 基本標簽元素 標題&#xff08;heading&#xff09; <h1>一級標題</h1> &…

騰訊云對象存儲服務(COS)

騰訊云對象存儲服務&#xff08;COS&#xff09; 安全、可擴展、低成本的云存儲解決方案 騰訊云 對象存儲服務&#xff08;COS&#xff0c;Cloud Object Storage&#xff09; 是一種高可靠、高性能、可擴展的云存儲服務&#xff0c;專為海量非結構化數據&#xff08;如圖片、…