交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
springmvc第4-demo-4:@PathVariable PathVariableMethodArgumentResolver
分享
未结
0
723
李延
LV6
2021-06-01
悬赏:20积分
# 作用 用于处理PathVariable注解,通过url路径传参 # 示例 Cotroller如下: ```java @Controller @RequestMapping("pathVariable") public class PathVariableTest { @GetMapping("get/path/{id}/{name}") private List<String> getTest(@PathVariable("name") String name,@PathVariable("id") Integer id){ System.out.println(name); System.out.println(id); return new ArrayList<>(); } } ``` 发送请求 ```java GET http://127.0.0.1:8080/pathVariable/get/path/1234/liy ``` 结果如下 ![image](http://note.youdao.com/yws/res/23567/F80F0997DB2144168212A30488400258) # 源码 继承自AbstractNamedValueMethodArgumentResolver。在RequestParam注解中已经说明,不再重复直接看他主要的方法 ## supportsParameter ```java @Override public boolean supportsParameter(MethodParameter parameter) { if (!parameter.hasParameterAnnotation(PathVariable.class)) { return false; } if (Map.class.isAssignableFrom(parameter.nestedIfOptional().getNestedParameterType())) { PathVariable pathVariable = parameter.getParameterAnnotation(PathVariable.class); return (pathVariable != null && StringUtils.hasText(pathVariable.value())); } return true; } ``` 我们看到这个类处理了PathVariable注解的参数 ## resolveArgument 去除掉 对于文件参数的处理外,我们只有一下代码 ```java protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception { Map<String, String> uriTemplateVars = (Map<String, String>) request.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); return (uriTemplateVars != null ? uriTemplateVars.get(name) : null); } ``` 我们看到通过path传参数的数据被保存在request中,以URI_TEMPLATE_VARIABLES_ATTRIBUTE属性。这里只是将起取出并通过name 取出。 而这个属性在哪里被设置,我们具体分析。 ## 数值设置 我们看一下AbstractHandlerMethodMapping类的lookupHandlerMethod方法。 在分析HANDLerMapping方法的时候我们看到这个方法是通过url匹配具体的Handler的。在最后调用了handleMatch方法,我们现在看一下handleMatch方法。 ```java @Override protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) { super.handleMatch(info, lookupPath, request); RequestCondition<?> condition = info.getActivePatternsCondition(); if (condition instanceof PathPatternsRequestCondition) { extractMatchDetails((PathPatternsRequestCondition) condition, lookupPath, request); } else { extractMatchDetails((PatternsRequestCondition) condition, lookupPath, request); } if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) { Set<MediaType> mediaTypes = info.getProducesCondition().getProducibleMediaTypes(); request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, mediaTypes); } } ``` 在这里我们调用了extractMatchDetails方法,我们看一下这个方法: ```java private void extractMatchDetails( PatternsRequestCondition condition, String lookupPath, HttpServletRequest request) { String bestPattern; Map<String, String> uriVariables; if (condition.isEmptyPathMapping()) { bestPattern = lookupPath; uriVariables = Collections.emptyMap(); } else { bestPattern = condition.getPatterns().iterator().next(); uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath); if (!getUrlPathHelper().shouldRemoveSemicolonContent()) { request.setAttribute(MATRIX_VARIABLES_ATTRIBUTE, extractMatrixVariables(request, uriVariables)); } uriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables); } request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern); request.setAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriVariables); } ``` 这里我们看到了具体的设置URI_TEMPLATE_VARIABLES_ATTRIBUTE属性
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号