Spring覆蓋jar包中路徑映射的幾種解決方案
問題背景
項(xiàng)目中使用Spring,通過@GetMapping("/api/user") 定義了路徑映射 /api/user,現(xiàn)在有個(gè)需求需要修改這個(gè)路徑映射下的代碼邏輯,而由于該定義來自引入的jar,無法直接修改代碼。
解決方案
1 使用@RequestMapping優(yōu)先級(jí)
Spring會(huì)優(yōu)先選擇更具體的映射:
@RestController
public class MyController {
@GetMapping(path = "/api/user", params = "myParam")
public String myMethod() {
return "My implementation";
}
}
當(dāng)url中帶有參數(shù)myParam時(shí),spring會(huì)映射到這里處理,也可以設(shè)置為 params = "myParam=1",即當(dāng)參數(shù)myParam=1時(shí)映射到此
2 使用Filter攔截并轉(zhuǎn)發(fā)請(qǐng)求到特定path
- 創(chuàng)建自定義Filter
@Component
public class PathOverrideFilter extends OncePerRequestFilter {
// 定義需要重定向的路徑映射
private static final Map<String, String> PATH_MAPPINGS = new HashMap<String, String>(){{
put("/api/user", "/api-new/user");
}};
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String requestURI = request.getRequestURI();
String redirectPath = PATH_MAPPINGS.get(requestURI);
// 檢查是否需要重定向
if (StringUtils.isNotBlank(redirectPath)) {
// 創(chuàng)建包裝請(qǐng)求,修改路徑信息
HttpServletRequest wrappedRequest = new HttpServletRequestWrapper(request) {
@Override
public String getRequestURI() {
return redirectPath;
}
@Override
public String getServletPath() {
return redirectPath;
}
};
// 繼續(xù)處理鏈,但使用修改后的請(qǐng)求
filterChain.doFilter(wrappedRequest, response);
return;
}
// 不需要重定向的請(qǐng)求正常處理
filterChain.doFilter(request, response);
}
}
- 創(chuàng)建目標(biāo)Controller方法
@RestController
public class NewController {
@GetMapping("/api-new/user")
public String myMethod() {
// 你的新實(shí)現(xiàn)
return "My new implementation";
}
}
對(duì)于大多數(shù)需要"覆蓋"功能的場(chǎng)景,Filter轉(zhuǎn)發(fā)路徑方案通常是最佳選擇,它平衡了簡(jiǎn)單性和功能性。
到此這篇關(guān)于Spring覆蓋jar包中路徑映射的幾種解決方案的文章就介紹到這了,更多相關(guān)Spring覆蓋jar包路徑映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springdoc替換swagger的實(shí)現(xiàn)步驟分解
最近在spring看到的,spring要對(duì)api文檔動(dòng)手了,有些人說swagger不好用,其實(shí)也沒那么不好用,有人說代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說還是有侵入性但是也可以沒有侵入性,這就看你對(duì)文檔有什么要求了2023-02-02
用C++實(shí)現(xiàn)求N!中末尾0的個(gè)數(shù)的方法詳解
這篇文章主要介紹了用C++實(shí)現(xiàn)求N!中末尾0的個(gè)數(shù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
SpringBoot?+?MyBatis-Plus構(gòu)建樹形結(jié)構(gòu)的幾種方式
在實(shí)際開發(fā)中,很多數(shù)據(jù)都是樹形結(jié)構(gòu),本文主要介紹了SpringBoot?+?MyBatis-Plus構(gòu)建樹形結(jié)構(gòu)的幾種方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
IDEA一致卡在build時(shí)間過長(zhǎng)問題解決
有很多小伙伴在起項(xiàng)目的時(shí)候巨慢,特別影響開發(fā)效率,本文主要介紹了IDEA一致卡在build時(shí)間過長(zhǎng)問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
springboot項(xiàng)目獲取請(qǐng)求頭當(dāng)中的token的方法
本文主要介紹了springboot項(xiàng)目獲取請(qǐng)求頭當(dāng)中的token的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
基于eclipse.ini內(nèi)存設(shè)置的問題詳解
本篇文章是對(duì)eclipse.ini內(nèi)存設(shè)置的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁功能
這篇文章主要為大家詳細(xì)介紹了PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

