SpringBoot如何根據(jù)目錄結(jié)構(gòu)生成API接口前綴
一、根據(jù)目錄結(jié)構(gòu)生成接口前綴
在寫api的接口時,通常有很多版本的迭代,比如:v1、v2。
如圖所示,建立的包結(jié)構(gòu)。
列舉v1版本,每新建一個controller都要寫上@RequestMapping("/v1/****")的路由的前綴,如果v1下面還有幾個包結(jié)構(gòu),這樣路由就要寫的很麻煩。
我們可以通過當前api下的目錄結(jié)構(gòu)自動加上請求前綴。
二、自定義RequestMappingInfo
在Spring里有一個專門處理擁有@RequestMapping()注解的控制器的類(RequestMappingHandlerMapping),因為我們要修改控制器的路由。
- 寫一個類繼承RequestMappingHandlerMapping,重寫類的getMappingForMethod方法。這個方法就是定義和生成路由。
- 調(diào)用基類的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。
- 這里要進行路由前綴的修改,封裝一個方法getPrefix(),而handlerType這個參數(shù)就是獲取控制器的信息。
- 獲取控制器的目錄結(jié)構(gòu),進行替換,保留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生成接口文檔的詳細過程
- 關(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)文章
mybatis返回list<Integer>時resultType寫Integer問題
這篇文章主要介紹了mybatis返回list<Integer>時resultType寫Integer問題,具有很好的參考價值,希望對大家有所幫助,2023-12-12SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作
這篇文章主要介紹了SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,主要使用Jpa連接數(shù)據(jù)庫對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,需要的朋友可以參考下2023-05-05FactoryBean?BeanFactory方法使用示例詳解講解
這篇文章主要為大家介紹了FactoryBean?BeanFactory方法使用示例詳解講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解
這篇文章主要介紹了SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07