欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot如何根據(jù)目錄結構生成API接口前綴

 更新時間:2022年02月18日 10:17:32   作者:Y7000也拯救不了我  
這篇文章主要介紹了SpringBoot如何根據(jù)目錄結構生成API接口前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、根據(jù)目錄結構生成接口前綴

在寫api的接口時,通常有很多版本的迭代,比如:v1、v2。

如圖所示,建立的包結構。

列舉v1版本,每新建一個controller都要寫上@RequestMapping("/v1/****")的路由的前綴,如果v1下面還有幾個包結構,這樣路由就要寫的很麻煩。

我們可以通過當前api下的目錄結構自動加上請求前綴。

二、自定義RequestMappingInfo

在Spring里有一個專門處理擁有@RequestMapping()注解的控制器的類(RequestMappingHandlerMapping),因為我們要修改控制器的路由。

  • 寫一個類繼承RequestMappingHandlerMapping,重寫類的getMappingForMethod方法。這個方法就是定義和生成路由。
  • 調用基類的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。
  • 這里要進行路由前綴的修改,封裝一個方法getPrefix(),而handlerType這個參數(shù)就是獲取控制器的信息。
  • 獲取控制器的目錄結構,進行替換,保留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的請求路徑沒有修改。

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

成功訪問,不管目錄多么復雜都實現(xiàn)了根據(jù)目錄結構生成路由前綴,不用修改控制器的requestMapping。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論