SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)配置Url前綴方式
在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能夠響應(yīng)前端的請(qǐng)求都需要我們主動(dòng)去注冊(cè)到應(yīng)用程序上。而Spring不需要我們自己去注冊(cè),由Spring通過(guò)掃描注解的方式去主動(dòng)發(fā)現(xiàn)。
自定義RequestMappingInfo
Spring中的RequestMappingHandlerMapping專(zhuān)門(mén)來(lái)負(fù)責(zé)處理標(biāo)注了@RequestMapping的控制器。創(chuàng)建一個(gè)類(lèi)繼承并覆蓋其中的方法,從而實(shí)現(xiàn)對(duì)默認(rèn)機(jī)制的修改。
覆蓋其中的getMappingForMethod方法,這個(gè)方法的返回值RequestMappingInfo就包含了請(qǐng)求的Url,修改RequestMappingInfo中的Url從而修改路由中的Url。
package com.lin.missyou.hack; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.lang.reflect.Method; public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping { @Value("${missyou.api-package}") private String apiPackagePath ; //從配置文件中獲取根包的路徑 @Override protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) { RequestMappingInfo requestMappingInfo = super.getMappingForMethod(method, handlerType); if(null != requestMappingInfo){ //獲取url前綴 String prefix = getPrefix(handlerType); //根據(jù)url前綴生成RequestMappingInfo并與原有的RequestMappingInfo合并 RequestMappingInfo mappingInfo = RequestMappingInfo.paths(prefix).build().combine(requestMappingInfo); return mappingInfo; } return requestMappingInfo; } private String getPrefix(Class<?> handlerType){ String packageName = handlerType.getPackage().getName(); //獲取控制器所在包路徑 String dotPath = packageName.replaceAll(this.apiPackagePath,""); //將包路徑中多于的部分截取掉 return dotPath.replace(".","/"); //將包路徑中的.替換成/ } }
通過(guò)接口的形式發(fā)現(xiàn)類(lèi)
創(chuàng)建一個(gè)配置類(lèi)AutoPrefixConfiguration將AutoPrefixUrlMapping加入到容器。配置類(lèi)AutoPrefixConfiguration實(shí)現(xiàn)接口WebMvcRegistrations并覆蓋其中的getRequestMappingHandlerMapping方法
package com.lin.missyou.core.config; import com.lin.missyou.hack.AutoPrefixUrlMapping; import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Component public class AutoPrefixConfiguration implements WebMvcRegistrations { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new AutoPrefixUrlMapping(); } }
在配置文件中指定根包
missyou.api-package = com.lin.missyou.api
SprinBoot的 發(fā)現(xiàn)機(jī)制 有兩種。一種是在控制器上標(biāo)注特定注解,例如上一篇文章SpringBoot全局異常處理中在GlobalExceptionAdvice 上標(biāo)注@ControllerAdvice。另外一種是實(shí)現(xiàn)特定接口并覆蓋其中的特定方法,例如上面的AutoPrefixConfiguration。
測(cè)試一下
訪問(wèn)結(jié)果,訪問(wèn)路徑/v1/banner/test可以訪問(wèn)到該控制器
將訪問(wèn)路徑改為/banner/test就訪問(wèn)不到了
將BannerController移動(dòng)到sample文件夾下訪問(wèn)路徑/v1/sample/banner/test可以訪問(wèn)到該控制器
這個(gè)方法存在一些爭(zhēng)議。一方面認(rèn)為根據(jù)目錄結(jié)構(gòu)自動(dòng)生成url雖然比較簡(jiǎn)單,少寫(xiě)了一些代碼,但是無(wú)法通過(guò)控制器上標(biāo)注的@RequestMapping中的參數(shù)直接看出url,代碼的可讀性不是太好。
另一方面認(rèn)為,這個(gè)方法大大的簡(jiǎn)化了我們代碼的編寫(xiě),同時(shí)更加易于維護(hù),控制器隨意調(diào)整所在目錄都不需要去修改代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于JavaMail的Java實(shí)現(xiàn)復(fù)雜郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了基于JavaMail的Java實(shí)現(xiàn)復(fù)雜郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09mybatis映射和實(shí)際類(lèi)型不一致的問(wèn)題
這篇文章主要介紹了mybatis映射和實(shí)際類(lèi)型不一致的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11jmeter下載及安裝配置教程(win10平臺(tái)為例)
Apache?JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具,Apache?jmeter?可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java?對(duì)象,數(shù)據(jù)庫(kù)和查詢(xún),F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試,本文給大家介紹jmeter下載及安裝配置過(guò)程,感興趣的朋友一起看看吧2021-12-12SpringBoot 動(dòng)態(tài)配置郵箱發(fā)件人過(guò)程解析
這篇文章主要介紹了SpringBoot 動(dòng)態(tài)配置郵箱發(fā)件人過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08當(dāng)mybatis返回值遇見(jiàn)內(nèi)部類(lèi)的問(wèn)題
這篇文章主要介紹了當(dāng)mybatis返回值遇見(jiàn)內(nèi)部類(lèi)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12springboot整合SSE技術(shù)開(kāi)發(fā)小結(jié)
本文主要介紹了springboot整合SSE技術(shù)開(kāi)發(fā)小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11Java查詢(xún)Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢(xún))、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序
在Java開(kāi)發(fā)中Elasticsearch(簡(jiǎn)稱(chēng)ES)是一個(gè)非常流行的搜索引擎,它提供了強(qiáng)大的全文搜索和分析功能,這篇文章主要給大家介紹了關(guān)于Java查詢(xún)Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢(xún))、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序的相關(guān)資料,需要的朋友可以參考下2024-05-05