您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“SpringBoot如何根據(jù)目錄結(jié)構(gòu)自動配置Url前綴”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SpringBoot如何根據(jù)目錄結(jié)構(gòu)自動配置Url前綴”這篇文章吧。
在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能夠響應(yīng)前端的請求都需要我們主動去注冊到應(yīng)用程序上。而Spring不需要我們自己去注冊,由Spring通過掃描注解的方式去主動發(fā)現(xiàn)。
Spring中的RequestMappingHandlerMapping專門來負責(zé)處理標注了@RequestMapping的控制器。創(chuàng)建一個類繼承并覆蓋其中的方法,從而實現(xiàn)對默認機制的修改。
覆蓋其中的getMappingForMethod方法,這個方法的返回值RequestMappingInfo就包含了請求的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(".","/"); //將包路徑中的.替換成/ } }
創(chuàng)建一個配置類AutoPrefixConfiguration將AutoPrefixUrlMapping加入到容器。配置類AutoPrefixConfiguration實現(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)機制 有兩種。一種是在控制器上標注特定注解,例如上一篇博文 SpringBoot全局異常處理中在GlobalExceptionAdvice 上標注@ControllerAdvice。另外一種是實現(xiàn)特定接口并覆蓋其中的特定方法,例如上面的AutoPrefixConfiguration。
測試一下
訪問結(jié)果,訪問路徑/v1/banner/test可以訪問到該控制器
將訪問路徑改為/banner/test就訪問不到了
將BannerController移動到sample文件夾下訪問路徑/v1/sample/banner/test可以訪問到該控制器
這個方法存在一些爭議。一方面認為根據(jù)目錄結(jié)構(gòu)自動生成url雖然比較簡單,少寫了一些代碼,但是無法通過控制器上標注的@RequestMapping中的參數(shù)直接看出url,代碼的可讀性不是太好。
另一方面認為,這個方法大大的簡化了我們代碼的編寫,同時更加易于維護,控制器隨意調(diào)整所在目錄都不需要去修改代碼。
以上是“SpringBoot如何根據(jù)目錄結(jié)構(gòu)自動配置Url前綴”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。