电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java工具類之@RequestMapping注解

瀏覽:111日期:2022-08-12 08:41:44
目錄一、前言二、代碼實現(xiàn)三、效果一、前言

問題闡述:在某一場景下,我們的代碼在 Service 實現(xiàn)相同,但卻在 Controller 層訪問時卻希望不同的前綴可以訪問。如下 :/say/hello。我們這里希望在不借助任何外部服務(wù)的情況下 通過 /a/say/hello 和 /b/say/hello 都可以訪問到該接口,同時不想在 Controller 中寫兩個方法。

@RestController@RequestMapping('say')public class SayController { @Autowired private SayService sayService; @RequestMapping('hello') public String hello() {return sayService.hello(); }}二、代碼實現(xiàn)

我們這里簡單說明一下思路:

1.在 Spring 服務(wù)啟動后, HandlerMapping 的實現(xiàn)類 RequestMappingHandlerMapping 會獲取到被 @RequestMapping等請求注解修飾的方法,并封裝成一個個 HandlerMethod 保存到 RequestMappingHandlerMapping#MappingRegistry 中(HandlerMapping 具有多個實現(xiàn)類,每個實現(xiàn)類具有不同規(guī)則)。

2.當(dāng) DispatcherServlet 接收到請求后會根據(jù) url 獲取 合適的 HandlerMapping 組成 HandlerExecutionChain(處理器執(zhí)行鏈),隨后通過 HandlerAdapter 來進行請求處理。而這里通過 HandlerMapping 會根據(jù)請求 URL 獲取到匹配的 HandlerMethod 進行方法調(diào)用。

因此我們這里有了兩種思路 :

1.在 Spring 加載 HandlerMethod 時設(shè)置當(dāng)前 HandlerMethod 的匹配規(guī)則為 /a/say/hello/、/b/say/hello/,當(dāng) /a/say/hello/、/b/say/hello/ 請求訪問時可以與之匹配。

2.在請求處理的時候,通過攔截器將 /a/say/hello/、/b/say/hello/ 的訪問路徑匹配到 /say/hello 方法上。

本文選擇第一種思路(不過話說怎么想都是第一種好吧)做一個簡單demo示例,其實現(xiàn)如下:

// 自定義分發(fā)注解@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RequestRouter { String[] value() default '';}

package com.kingfish.springjdbcdemo.config;import lombok.SneakyThrows;import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;import org.springframework.web.servlet.mvc.method.RequestMappingInfo;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;import javax.servlet.http.HttpServletRequest;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Arrays;import java.util.Set;import java.util.stream.Collectors;/** * @Author : kingfish * @Email : kingfishx@163.com * @Data : 2021/4/21 16:47 * @Desc : 路由 HandlerMapping 的實現(xiàn) */@Component('handlerMapping')public class RouterRequestMappingHandlerMapping extends RequestMappingHandlerMapping {// 在將 方法封裝成 HandlerMethod 時會調(diào)用此方法 @SneakyThrows @Override protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) { // 獲取 RequestRouter 注解 RequestRouter requestRouter = method.getAnnotation(RequestRouter.class);if (requestRouter == null) { requestRouter = handlerType.getAnnotation(RequestRouter.class); if (requestRouter == null) {for (Class<?> handlerTypeInterface : handlerType.getInterfaces()) { if ((requestRouter = handlerTypeInterface.getAnnotation(RequestRouter.class)) != null) {break; }} }}// 調(diào)用父類,生成 RequestMappingInfo RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);if (requestRouter != null) {// 如果 requestRouter 不為空,則進行路徑處理 String[] requestRouterValue = requestRouter.value(); PatternsRequestCondition condition = mappingForMethod.getPatternsCondition(); // 獲取當(dāng)前方法匹配的路徑,隨即進行添加處理。 Set<String> patterns = condition.getPatterns(); Set<String> routerPatterns = patterns.stream() // 拼接 請求路徑。這里可以自定義處理策略 .flatMap(pattern -> Arrays.stream(requestRouterValue).map(val -> '/' + val + pattern)) .collect(Collectors.toSet()); // 將拼接后的路徑添加到 RequestMappingInfo 中 patterns.addAll(routerPatterns);}return mappingForMethod; }}

@Configurationpublic class SpringConfig { @Bean public DispatcherServlet dispatcherServlet(){DispatcherServlet dispatcherServlet = new DispatcherServlet();// 禁止加載所有的handlerMapper,而只加載beanName 為 handlerMapper 的beandispatcherServlet.setDetectAllHandlerMappings(false);return dispatcherServlet; }}

這里需要注意 :

1.HandlerMapping 在 Spring中有多個實現(xiàn),而 dispatcherServlet.setDetectAllHandlerMappings(false); 參數(shù)設(shè)置Spring 放棄加載多個 HandlerMapping,而只加載 beanName為 handlerMapping 的

2.HandlerMapping。RequestMappingInfo 包含 當(dāng)前方法的諸多信息,其中就包含 什么樣請求路徑可以匹配到該方法,所以我們在這里獲取到 RequestRouter 的信息,并添加到匹配路徑上。

三、效果

在 方法上加上 @RequestRouter(value = {'a', 'b'}) 注解

@RestController@RequestMapping('say')public class SayController { @Autowired private SayService sayService; @RequestRouter(value = {'a', 'b'}) @RequestMapping('hello') public String hello() {return sayService.hello(); }}

/a/say/hello/、/b/say/hello/ 以及 /say/hello/ 都可以訪問

Java工具類之@RequestMapping注解Java工具類之@RequestMapping注解

到此這篇關(guān)于Java工具類之@RequestMapping注解的文章就介紹到這了,更多相關(guān)Java RequestMapping內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 三价铬_环保铬_环保电镀_东莞共盈新材料贸易有限公司 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | BHK汞灯-百科|上海熙浩实业有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 |