当前位置:首页 > 科技  > 软件

是否还记得SpringMVC中的@MatrixVariable注解?

来源: 责编: 时间:2024-02-29 14:41:19 252观看
导读环境:SpringBoot3.0.51. 简介RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】讨论了路径段中的name-value对。在Spring MVC中,我们将它们称为“矩阵变量”,但它们也可以称为URI路径参数。矩阵变

环境:SpringBoot3.0.5QTp28资讯网——每日最新资讯28at.com

1. 简介

RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】讨论了路径段中的name-value对。在Spring MVC中,我们将它们称为“矩阵变量”,但它们也可以称为URI路径参数。QTp28资讯网——每日最新资讯28at.com

矩阵变量可以出现在任何路径段中,每个变量用分号分隔,多个值用逗号分隔(例如/cars;color=red,green;year=2012)。还可以通过重复的变量名指定多个值(例如,color=red;color=green;color=blue)。QTp28资讯网——每日最新资讯28at.com

如果期望URL包含矩阵变量,则控制器方法的请求映射必须使用URI变量来屏蔽变量内容,并确保请求可以成功匹配,而不依赖于矩阵变量的顺序和存在。下面的例子使用了一个矩阵变量:QTp28资讯网——每日最新资讯28at.com

// GET /pets/42;q=11;r=22@GetMapping("/pets/{petId}")public void findPet(@PathVariable String petId, @MatrixVariable int q) {  // petId == 42  // q == 11}

@MatrixVariable应用场景QTp28资讯网——每日最新资讯28at.com

  • 主要适用于需要在URI路径中传递多个与路径段相关的参数,并且希望保持URI清晰、语义化的情况下。
  • 一个资源需要通过多维度资源定位时,一个URI可能需要同时标识多个维度的信息。比如在一个图片处理服务中,可能会通过颜色模式、分辨率等参数来定位特定版本的图片资源。
/images/pic1.png;colors=rgb;resolution=high

2. 实战案例

2.1 案例1 

@GetMapping("/m1/{id}")public Object matrix1(@PathVariable("id") Long id, @MatrixVariable Integer q, @MatrixVariable String p) {  return String.format("input, id: %d, q: %d, p: %s", id, q, p) ;}

请求QTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

2.2 案例2

多个矩阵变量,在不同的路径变量中定义QTp28资讯网——每日最新资讯28at.com

@GetMapping("/m2/{cateId}/a2/{artId}")public Object matrix2(    @PathVariable("cateId") Long cateId,     @MatrixVariable(pathVar = "cateId", name = "q") Integer q1,     @PathVariable("artId") Long artId,     @MatrixVariable(pathVar = "artId", name = "q") Integer q2) {  return String.format("input, cateId: %d, q: %d, artId: %d, q: %s%n",       cateId, q1, artId, q2) ;}

请求QTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

2.3 案例3

使用Map接收矩阵值QTp28资讯网——每日最新资讯28at.com

@GetMapping("/m3/{cateId}/a2/{artId}")public Object matrix3(    @PathVariable("cateId") Long cateId,     @MatrixVariable MultiValueMap<String, String> cateMap,     @PathVariable("artId") Long artId,     @MatrixVariable(pathVar = "artId") MultiValueMap<String, String> artMap) {  return Map.of("cate", cateMap, "art", artMap) ;}

请求QTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

注意:这里的a=1,2有多个值可以使用','分割。QTp28资讯网——每日最新资讯28at.com

2.4 案例4

当变量路径之后没有添加矩阵参数时,会报错。QTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

我们可以通过配置,指定非必须活着设定默认值。QTp28资讯网——每日最新资讯28at.com

@GetMapping("/m2/{cateId}/a2/{artId}")  public Object matrix2(      ...,      // 设置默认值      @MatrixVariable(pathVar = "artId", name = "q", required = false, defaultValue = "999") Integer q2) {    return String.format("input, cateId: %d, q: %d, artId: %d, q: %s%n",         cateId, q1, artId, q2) ;  }

3. 实现原理

这里以上面的 案例2 讲解。QTp28资讯网——每日最新资讯28at.com

3.1 路径匹配存储矩阵变量

public abstract class AbstractHandlerMethodMapping {  protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {    HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request);  }  protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) {    handleMatch(bestMatch.mapping, lookupPath, request);  }}

beastMatch.mappingQTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

lookupPathQTp28资讯网——每日最新资讯28at.com

图片图片QTp28资讯网——每日最新资讯28at.com

public abstract class RequestMappingInfoHandlerMapping {  protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) {    extractMatchDetails(pprc, lookupPath, request);  }  private void extractMatchDetails(...) {    // 将矩阵编码存入到request对象中    request.setAttribute(MATRIX_VARIABLES_ATTRIBUTE, result.getMatrixVariables());  }}

3.2 解析@MatrixVariable注解的参数QTp28资讯网——每日最新资讯28at.com

public class MatrixVariableMethodArgumentResolver {  protected Object resolveName(...) throws Exception {    // 从request中取出上一步存入的map集合    Map<String, MultiValueMap<String, String>> pathParameters = (Map<String, MultiValueMap<String, String>>)        request.getAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);    MatrixVariable ann = parameter.getParameterAnnotation(MatrixVariable.class);    // 获取注解配置的pathVar值    String pathVar = ann.pathVar();    if (!pathVar.equals(ValueConstants.DEFAULT_NONE)) {      if (pathParameters.containsKey(pathVar)) {        // 取出值        paramValues = pathParameters.get(pathVar).get(name);      }    }    // 返回数据    return paramValues.get(0);  }}

以上本篇文章的全部内容,希望对你有所帮助。QTp28资讯网——每日最新资讯28at.com

完毕!!!QTp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75322-0.html是否还记得SpringMVC中的@MatrixVariable注解?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一个超冷门的 Vue3 内置组件,帮我优化了66%的性能!

下一篇: Android平台原生音视频编解码MediaCodec介绍

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • OPPO Reno10 Pro英雄联盟定制礼盒公布:萨勒芬妮同款配色梦幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新机,全系标配了超光影长焦镜头,是迄今为止拍照
Top