Spring boot 2.0 升級到 3.3.1 的相關問題 (一)

文章目錄

  • Spring boot 2.0 升級到 3.3.1 的相關問題 (一)
    • 攔截器Interceptor的變動
      • 問題介紹
      • 解決方案
    • WebMvcConfigurerAdapter 自定義Mvc配置
      • 問題介紹
      • 解決方案

Spring boot 2.0 升級到 3.3.1 的相關問題 (一)

攔截器Interceptor的變動

問題介紹

在2.0 版本可以通過繼承org.springframework.web.servlet.handler.HandlerInterceptorAdapter 類來實現一個攔截器,在2.4.0 版本開始標記為棄用,在3.3.1 版本已經沒有這個類了,需要使用新的方式來實現。

解決方案

直接實現 org.springframework.web.servlet.HandlerInterceptor 接口即可。

原代碼:

import com.abc.springboot.frame.constant.FrameConstant;
import com.abc.springboot.frame.pojo.dto.SystemSecurityRequestDTO;
import com.abc.springboot.frame.utils.RequestUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 檢查客戶端版本號攔截器*/
@Slf4j
public class CheckClientVersionInterceptor extends HandlerInterceptorAdapter {/*** 檢查客戶端版本是否有效*/@Autowiredprivate ICheckClientVersionHandler checkClientVersionHandler;/*** 請求處理前處理* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {//獲取請求參數SystemSecurityRequestDTO requestDTO = RequestUtils.getAndSetSystemSecurityRequestDTO(request);//校驗客戶端版本號try{boolean checkResult =  checkClientVersionHandler.checkClientVersion(requestDTO,request.getHeader(FrameConstant.HTTP_HEADER_CLIENT_VERSION),request.getHeader(FrameConstant.HTTP_HEADER_CLIENT_TYPE));if(!checkResult){log.info("版本號不支持【{}】【{}】",requestDTO.getMethod(),requestDTO.getUri());request.getRequestDispatcher(FrameConstant.APPLICATION_URL_CLIENT_VERSION_VERIFY_FAILED).forward(request, response);return false;}return true;}catch (Exception e){log.warn("記錄系統請求日志失敗。",e);return false;}}
}

新代碼


import com.abc.springboot.frame.constant.FrameConstant;
import com.abc.springboot.frame.pojo.dto.SystemSecurityRequestDTO;
import com.abc.springboot.frame.utils.RequestUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;/*** 檢查客戶端版本號攔截器*/
@Slf4j
public class CheckClientVersionInterceptor implements HandlerInterceptor {/*** 檢查客戶端版本是否有效*/@Autowiredprivate ICheckClientVersionHandler checkClientVersionHandler;/*** 請求處理前處理* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {//獲取請求參數SystemSecurityRequestDTO requestDTO = RequestUtils.getAndSetSystemSecurityRequestDTO(request);//校驗客戶端版本號try{boolean checkResult =  checkClientVersionHandler.checkClientVersion(requestDTO,request.getHeader(FrameConstant.HTTP_HEADER_CLIENT_VERSION),request.getHeader(FrameConstant.HTTP_HEADER_CLIENT_TYPE));if(!checkResult){log.info("版本號不支持【{}】【{}】",requestDTO.getMethod(),requestDTO.getUri());request.getRequestDispatcher(FrameConstant.APPLICATION_URL_CLIENT_VERSION_VERIFY_FAILED).forward(request, response);return false;}return true;}catch (Exception e){log.warn("記錄系統請求日志失敗。",e);return false;}}
}

WebMvcConfigurerAdapter 自定義Mvc配置

問題介紹

在2.0 版本可以通過繼承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter 類來實現自定義Mvc攔截器,在2.4.0 版本開始標記為棄用,在3.3.1 版本已經沒有這個類了,需要使用新的方式來實現。

解決方案

org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter 類在 Spring Framework 5.0 之后被標記為已棄用,并在 Spring Boot 2.0 中不再推薦使用 。

替代方案有兩種:

直接實現 WebMvcConfigurer 接口:
這是官方推薦的替代方法。WebMvcConfigurer 接口提供了多種默認方法(即帶有實現的方法),允許開發者只實現所需的配置方法,而不必要實現接口中的所有方法。這種方式不會影響 Spring Boot 自身的 @EnableAutoConfiguration,允許 Spring Boot 的自動配置生效 。

繼承 WebMvcConfigurationSupport 類:
另一種方法是繼承 WebMvcConfigurationSupport 類。這個類提供了 Spring MVC 的默認配置,通過繼承它,可以覆蓋特定的方法來自定義配置。但請注意,使用這種方式將覆蓋 Spring Boot 的自動配置,因此如果某個方法沒有被重寫,可能會導致相關功能的缺失,比如靜態資源的處理 。

總結來說,如果你需要進行一些簡單的自定義配置,并且想要保留 Spring Boot 的自動配置功能,推薦直接實現 WebMvcConfigurer 接口。如果你需要更全面的控制 Spring MVC 的配置,可以考慮繼承 WebMvcConfigurationSupport 類,但要確保所有必要的配置都被正確覆蓋和實現。

原代碼

import com.abc.utils.formatter.LocalDateTimeFormatter;
import com.abc.utils.formatter.StringFormatter;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import java.time.LocalDateTime;/*** 自定義的Mvc配置,用于配置格式化程序* @author 徐明龍 XuMingLong 2022-03-17*/
@Configuration
public class CustomWebMvcFormattersConfigurer extends WebMvcConfigurerAdapter  {@Overridepublic void addFormatters(FormatterRegistry registry) {//僅對Path方式傳入的參數生效registry.addFormatterForFieldType(String.class, new StringFormatter());registry.addFormatterForFieldType(LocalDateTime.class, new LocalDateTimeFormatter());}
}

新代碼

import com.abc.utils.formatter.LocalDateTimeFormatter;
import com.abc.utils.formatter.StringFormatter;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.time.LocalDateTime;/*** 自定義的Mvc配置,用于配置格式化程序* @author 徐明龍 XuMingLong 2022-03-17*/
@Configuration
public class CustomWebMvcFormattersConfigurer implements WebMvcConfigurer {@Overridepublic void addFormatters(FormatterRegistry registry) {//僅對Path方式傳入的參數生效registry.addFormatterForFieldType(String.class, new StringFormatter());registry.addFormatterForFieldType(LocalDateTime.class, new LocalDateTimeFormatter());}
}

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

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

相關文章

單鏈表算法 - 鏈表的中間節點

. - 力扣(LeetCode). - 備戰技術面試?力扣提供海量技術面試資源,幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/middle-of-the-linked-list/description/ 思路1: 思路2: 代碼: /*** …

【接口自動化_06課_Pytest+Excel+Allure完整框架集成】

一、logging在接口自動化里的應用 1、設置日志的配置,并收集日志文件 日志的設置需要在pytest.ini文件里設置。這個里面盡量不要有中文 2、debug日志的打印 pytest.ini文件的開關一定得是true才能在控制臺打印日志 import allure import pytest from P06_PytestFr…

CUDA cuDNN和pytorch(GPU版)的完整安裝教程

? * 說明: 本教程使用wsl-ubuntu20.04, 其他發行版linux的命令可能有所區別. *實測機型: i5-13500HX | RTX 4060 Laptop 一、下載CUDA12.X版本 這里以下載CUDA12.2為例。 前往cuda-12.2下載頁, 按照如圖方式選擇合適的選項: 按照官方給出的命令, 在b…

Trie樹的應用

Trie樹的應用 題目解題思路代碼 題目 維護一個字符串集合,支持兩種操作: I x 向集合中插入一個字符串 x x x;Q x 詢問一個字符串在集合中出現了多少次。 共有 N N N 個操作,所有輸入的字符串總長度不超過 1 0 5 10^5 105&am…

ArkTS學習筆記_封裝復用之@builderParam裝飾器

ArkTS學習筆記_封裝復用之builderParam裝飾器 作用: 在自定義組件中,該裝飾器用于裝飾函數成員變量,builderParam裝飾的函數成員變量的值必須是經過builder裝飾的方法。變量初始化后可以在自定義組件內調用。初始化: 可以使用自定…

移動應用性能關注分析哪些指標

移動應用常見性能指標 要對應用開展性能測試,首先需要了解需要重點關注哪些指標?指標的參考范圍大致是多少?可采用哪些工具收集這些指標?如何收集?如果指標有異常,大致有哪些high level的優化思路。這篇博客…

說一下GET請求和POST請求的區別

面試官常常會問到的一個問題就是:GET請求和POST請求的區別。因為一個看似簡單的問題就能考察出面試者對網絡協議和通信的掌握程度以及對前后端開發基礎知識是否了解、安全性意識是否足夠強,以及綜合分析與總結能力等。 所以答的好可以讓面試官對你刮目相…

YoloV8改進策略:卷積篇|Kan行天下之GRAM,KAN遇見Gram多項式V2版本

GRAM(GRAM可能是一個新提出的模型或方法的縮寫,這里我們根據上下文進行解釋)受到諸如TorchKAN和ChebyKAN等Kolmogorov-Arnold網絡(KAN)替代方案的啟發。GRAM引入了一種簡化的KAN模型,但同時利用了Gram多項式變換的簡單性。它與其他替代方案的不同之處在于其獨特的離散性特…

Vue3 使用emoji表情包 emoji-mart-vue-fast

文檔&#xff1a;emoji-mart-vue-fast - npm (npmjs.com) 非常簡單 代碼直接照抄即可 1. 引入 pnpm install emoji-mart-vue-fast 2. 使用 <template><Picker:data"emojiIndex":emojiSize"18":showPreview"false":infiniteScroll&quo…

【07】分布式事務解決方案

1、事務簡介 事務(Transaction)是訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。在關系數據庫中&#xff0c;一個事務由一組SQL語句組成。事務應該具有ACID四個特性&#xff1a;原子性、一致性、隔離性、持久性。任何事務機制在實現時&#xff0c;都應該考慮事務…

J025_斗地主游戲案例開發(簡版)

一、需求描述 完成斗地主游戲的案例開發。 業務&#xff1a;總共有54張牌&#xff1b; 點數&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、紅桃、方片、梅花 大小王&#xff1a;大王、小王 點數分別要組合4種花色&#xff0c;大小王各一張。…

[激光原理與應用-114]:南京科耐激光-激光焊接-焊中檢測-智能制程監測系統IPM介紹 - 18 - 產品宣傳、介紹、產品價值、幫助客戶解決的問題

目錄 一、第一印象 1.1 我是誰&#xff1f;產品是什么&#xff1f;產品在產業鏈中的位置 1.2 公司在產業鏈中的位置&#xff1f;公司簡介&#xff1f; 二、IPM工作原理 2.1 IPM系統組成 2.2 基于激光熔池光學檢測原理 2.3 基于信號特征的檢測原理 三、IPM產品如何與客…

2-17,18,19 -- 關于指針

指針(pointer 聲明指針 int *p;定義指針 int a 4; int *p &a; //指針p是指向變量a的地址的指針指針數組 int *arr[5];數組指針 int (*arr)[5];函數指針 int (*fun)(int,int) // 聲明一個指向函數的指針,這個函數的返回值是int,有兩個int的參數指針的指針 int **p;…

ArkTS學習筆記_封裝復用之@Styles裝飾器

ArkTS學習筆記_封裝復用之Styles裝飾器 背景&#xff1a; 在開發中&#xff0c;如果每個組件的樣式都需要單獨設置&#xff0c;就會出現大量代碼在進行重復樣式設置&#xff0c;雖然可以復制粘貼&#xff0c;但為了代碼簡潔性和后續方便維護&#xff0c;給出的思路是&#xff…

jmeter分布式(四)

一、gui jmeter的gui主要用來調試腳本 1、先gui創建腳本 先做一個腳本 演示&#xff1a;如何做混合場景的腳本&#xff1f; 用211的業務比例 ①啟動數據庫服務 數據庫服務&#xff1a;包括mysql、redis mysql端口默認3306 netstat -lntp | grep 3306處于監聽狀態&#xf…

深入了解MySQL中的innodb_lock_wait_timeout

引言 在數據庫管理中&#xff0c;確保數據的一致性和完整性是至關重要的。MySQL的InnoDB存儲引擎通過行級鎖定機制來實現這一點。然而&#xff0c;當多個事務同時操作數據庫時&#xff0c;可能會出現鎖等待的情況。了解并合理配置innodb_lock_wait_timeout參數&#xff0c;對于…

數據庫第6次作業

內容 1、創建視圖v_emp_dept_id_1&#xff0c;查詢銷售部門的員工姓名和家庭住址 2、創建視圖v_emp_dept&#xff0c;查詢銷售部門員工姓名和家庭住址及部門名稱。 3、創建視圖v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;統計每個部門人數并計算平均工資。 …

Spring 使用log4j

porn.xml 引入依賴 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j<…

解讀網傳《深圳IT圈?新解讀八小時工作制》

網傳深圳IT圈的新解讀八小時工作制 工作時間安排&#xff1a; 10:00-12:0014:00-18:0019:00-21:00 初看&#xff1a;有驚喜 上午開始時間晚&#xff1a;相對于傳統的9點開始&#xff0c;這種安排允許員工有更多的早晨時間&#xff0c;可以用來休息或處理個人事務。下午和晚上分…

typescript新規范及vue3常用的屬性解析【2024】

文章目錄 如在vue中 使用tyescript來規范定義類型解釋一下 < >的意思 定義 了 personList &#xff1a;是個數組 Array 且要告訴里面每一項 結構長什么樣 Array<PersonInter>definepropsvue3中的hooks組件父子組件 方法、數據、相互調用 如在vue中 使用tyescript來…