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

列舉v1版本,每新建一個(gè)controller都要寫上@RequestMapping("/v1/****")的路由的前綴,如果v1下面還有幾個(gè)包結(jié)構(gòu),這樣路由就要寫的很麻煩。
我們可以通過當(dāng)前api下的目錄結(jié)構(gòu)自動(dòng)加上請求前綴。
二、自定義RequestMappingInfo
在Spring里有一個(gè)專門處理擁有@RequestMapping()注解的控制器的類(RequestMappingHandlerMapping),因?yàn)槲覀円薷目刂破鞯穆酚伞?/p>
- 寫一個(gè)類繼承RequestMappingHandlerMapping,重寫類的getMappingForMethod方法。這個(gè)方法就是定義和生成路由。
- 調(diào)用基類的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。
- 這里要進(jìn)行路由前綴的修改,封裝一個(gè)方法getPrefix(),而handlerType這個(gè)參數(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容器中。
- 新建一個(gè)配置類繼承WebMvcRegistrations接口。實(shí)現(xiàn)getRequestMappingHandlerMapping方法,直接實(shí)例化AutoPrefixUrlMapping。
- 將配置類加入容器中@Component
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new AutoPrefixUrlMapping();
}
}
三、測試
在v1包下新建一個(gè)controller
@RestController()
@RequestMapping("/banner")
public class BannerController {
@GetMapping("/test")
public String test() {
return "你好 hello";
}
}
啟動(dòng)主程序,測試接口http://localhost:8080/v1/banner/test,
自動(dòng)合并了路由,v1是自動(dòng)拼接的。

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

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

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

