环境:SpringBoot3.0.5
RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】讨论了路径段中的name-value对。在Spring MVC中,我们将它们称为“矩阵变量”,但它们也可以称为URI路径参数。
矩阵变量可以出现在任何路径段中,每个变量用分号分隔,多个值用逗号分隔(例如/cars;color=red,green;year=2012)。还可以通过重复的变量名指定多个值(例如,color=red;color=green;color=blue)。
如果期望URL包含矩阵变量,则控制器方法的请求映射必须使用URI变量来屏蔽变量内容,并确保请求可以成功匹配,而不依赖于矩阵变量的顺序和存在。下面的例子使用了一个矩阵变量:
// GET /pets/42;q=11;r=22@GetMapping("/pets/{petId}")public void findPet(@PathVariable String petId, @MatrixVariable int q) { // petId == 42 // q == 11}
@MatrixVariable应用场景
/images/pic1.png;colors=rgb;resolution=high
@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) ;}
请求
图片
多个矩阵变量,在不同的路径变量中定义
@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) ;}
请求
图片
使用Map接收矩阵值
@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) ;}
请求
图片
注意:这里的a=1,2有多个值可以使用','分割。
当变量路径之后没有添加矩阵参数时,会报错。
图片
我们可以通过配置,指定非必须活着设定默认值。
@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) ; }
这里以上面的 案例2 讲解。
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.mapping
图片
lookupPath
图片
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注解的参数
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); }}
以上本篇文章的全部内容,希望对你有所帮助。
完毕!!!
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-75322-0.html是否还记得SpringMVC中的@MatrixVariable注解?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com