SpringBoot如何根據(jù)目錄結(jié)構(gòu)生成API接口前綴
一、根據(jù)目錄結(jié)構(gòu)生成接口前綴
在寫api的接口時,通常有很多版本的迭代,比如:v1、v2。
如圖所示,建立的包結(jié)構(gòu)。

列舉v1版本,每新建一個controller都要寫上@RequestMapping("/v1/****")的路由的前綴,如果v1下面還有幾個包結(jié)構(gòu),這樣路由就要寫的很麻煩。
我們可以通過當(dāng)前api下的目錄結(jié)構(gòu)自動加上請求前綴。
二、自定義RequestMappingInfo
在Spring里有一個專門處理擁有@RequestMapping()注解的控制器的類(RequestMappingHandlerMapping),因為我們要修改控制器的路由。
- 寫一個類繼承RequestMappingHandlerMapping,重寫類的getMappingForMethod方法。這個方法就是定義和生成路由。
- 調(diào)用基類的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。
- 這里要進(jìn)行路由前綴的修改,封裝一個方法getPrefix(),而handlerType這個參數(shù)就是獲取控制器的信息。
- 獲取控制器的目錄結(jié)構(gòu),進(jìn)行替換,保留api目錄之后的路徑。
- 這里的apiPackagePath,就是com.api。指定api是所有api的根目錄。
- 獲取到的請求路徑是.,替換為/。
- 得到了prefix前綴,修改MappingInfo。通過RequestMappingInfo的靜態(tài)方法合并url。
public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
@Value("${api-package}")
private String apiPackagePath;
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);
String prefix = getPrefix(handlerType);
if (mappingForMethod!=null){
return RequestMappingInfo.paths(prefix).build().combine(mappingForMethod);
}
return mappingForMethod;
}
private String getPrefix(Class<?> handlerType){
String packageName = handlerType.getPackage().getName();
String doPath = packageName.replaceAll(this.apiPackagePath, "");
return doPath.replace('.', '/');
}
}
- 配置類的方法將AutoPrefixUrlMapping類注入ioc容器中。
- 新建一個配置類繼承WebMvcRegistrations接口。實現(xiàn)getRequestMappingHandlerMapping方法,直接實例化AutoPrefixUrlMapping。
- 將配置類加入容器中@Component
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new AutoPrefixUrlMapping();
}
}
三、測試
在v1包下新建一個controller
@RestController()
@RequestMapping("/banner")
public class BannerController {
@GetMapping("/test")
public String test() {
return "你好 hello";
}
}
啟動主程序,測試接口http://localhost:8080/v1/banner/test,
自動合并了路由,v1是自動拼接的。

將controller移動到v2的sample包下,controller的請求路徑?jīng)]有修改。

這是重新服務(wù)再訪問http://localhost:8080/v2/sample/banner/test。

成功訪問,不管目錄多么復(fù)雜都實現(xiàn)了根據(jù)目錄結(jié)構(gòu)生成路由前綴,不用修改控制器的requestMapping。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細(xì)過程
- 關(guān)于springboot忽略接口,參數(shù)注解的使用ApiIgnore
- Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐
- SpringBoot?快速實現(xiàn)?api?接口加解密功能
- 詳解Springboot快速搭建跨域API接口的步驟(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin)
- SpringBoot整合Sa-Token實現(xiàn)?API?接口簽名安全校驗功能
- SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程
- SpringBoot實現(xiàn)API接口的完整代碼
- springboot接入方式對接股票數(shù)據(jù)源API接口的操作方法
相關(guān)文章
JAVA利用HttpClient進(jìn)行POST請求(HTTPS)實例
下面小編就為大家?guī)硪黄狫AVA利用HttpClient進(jìn)行POST請求(HTTPS)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起 小編過來看看吧2016-11-11
詳解SpringMVC的url-pattern配置及原理剖析
這篇文章主要介紹了SpringMVC的url-pattern配置及原理剖析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java傳入用戶名和密碼并自動提交表單實現(xiàn)登錄到其他系統(tǒng)的實例代碼
這篇文章主要介紹了Java傳入用戶名和密碼并自動提交表單實現(xiàn)登錄到其他系統(tǒng),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01
Java 多線程等待優(yōu)雅的實現(xiàn)方式之Phaser同步屏障
在JAVA 1.7引入了一個新的并發(fā)API:Phaser,一個可重用的同步barrier。在此前,JAVA已經(jīng)有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側(cè)重于 重用2021-11-11
Struts2中接收表單數(shù)據(jù)的三種驅(qū)動方式
這篇文章簡單給大家介紹了Struts2中接收表單數(shù)據(jù)的三種驅(qū)動方式,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-07-07
Java 8跳過本次循環(huán),繼續(xù)執(zhí)行以及跳出循環(huán),終止循環(huán)的代碼實例
今天小編就為大家分享一篇關(guān)于Java 8跳過本次循環(huán),繼續(xù)執(zhí)行以及跳出循環(huán),終止循環(huán)的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
SpringBoot+Redis布隆過濾器防惡意流量擊穿緩存
本文主要介紹了SpringBoot+Redis布隆過濾器防惡意流量擊穿緩存,文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Spring BeanPostProcessor源碼示例解析
這篇文章主要為大家介紹了Spring BeanPostProcessor源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

