Controller中的参数解析器【Spring源码学习】

mockRequest构建request请求

private static HttpServletRequest mockRequest(){MockHttpServletRequest request = new MockHttpServletRequest();request.setParameter("name1","zhangsan");request.setParameter("name2","lisi");request.setParameter("age","18");return new StandardServletMultipartResolver().resolveMultipart(request);
}

定义controller

static class Controller{public void test(@RequestParam("name1") String name1,String name2,@RequestParam("age") int age,@RequestParam(value = "home",defaultValue = "${JAVA_HOME}") String home1){}
}

解析过程

public static void main(String[] args) throws Exception {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(WebConfig.class);ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();HttpServletRequest multiRequest = mockRequest();// 控制器方法封装为 handlerMethodHandlerMethod handlerMethod = new HandlerMethod(new Controller(),Controller.class.getMethod("test", String.class, String.class, int.class,String.class));// 数据绑定工厂DefaultDataBinderFactory factory = new DefaultDataBinderFactory(null);// ModelAndViewContainer 存储Model结果.ModelAndViewContainer container = new ModelAndViewContainer();// 拿到当前控制器方法得参数信息for (MethodParameter methodParameter : handlerMethod.getMethodParameters()) {// 创建解析器对象 -> 是在HandlerMethodAdapter中RequestParamMethodArgumentResolver resolver = new RequestParamMethodArgumentResolver(beanFactory,false);// 拿到当前的参数methodParameter.initParameterNameDiscovery(new DefaultParameterNameDiscoverer());// 当前解析器支持这个参数进行处理 如果标注了@RequestParam注解从请求参数里找到对应的信息if (resolver.supportsParameter(methodParameter)) {Object v = resolver.resolveArgument(methodParameter,container,new ServletWebRequest(multiRequest),factory);System.out.println("[" + methodParameter.getParameterIndex() + "]" + methodParameter.getParameterType().getSimpleName() + " " + methodParameter.getParameterName() + "->" + v);}else{System.out.println("[" + methodParameter.getParameterIndex() + "]" + methodParameter.getParameterType().getSimpleName() + " " + methodParameter.getParameterName());}}
}

通过handlerMethod.getMethodParameters拿到方法对应的全部的参数,然后对参数内容进行解析,
RequestParamMethodArgumentResolver用来解析@RequestParam注解;
首先通过supportsParameter看当前参数是否满足解析要求;
如果满足则进行参数解析赋值;resolver.resolveArgument

使用组合解析器进行优化

每个参数的解析需要用到不同的参数解析器,那么我们可以定义一个组合的参数解析器,进行解析时逐个去解析我们组合解析器中参数解析找到满足的一个然后进行解析。

// 创建解析器组合对象内部会循环找到当前参数满足的解析器进行解析
HandlerMethodArgumentResolverComposite composite = new HandlerMethodArgumentResolverComposite();
composite.addResolvers(new RequestParamMethodArgumentResolver(beanFactory,false), // 解析@RequestParamnew PathVariableMethodArgumentResolver(), // 解析@PathVariablenew RequestHeaderMethodArgumentResolver(beanFactory), // 解析 @RequestHeadernew ServletCookieValueMethodArgumentResolver(beanFactory), // 解析@Cookie()new ExpressionValueMethodArgumentResolver(beanFactory) // 解析@Value
);// 拿到当前的参数
methodParameter.initParameterNameDiscovery(new DefaultParameterNameDiscoverer());
// 当前解析器支持这个参数进行处理 如果标注了@RequestParam注解从请求参数里找到对应的信息
if (composite.supportsParameter(methodParameter)) {Object v = composite.resolveArgument(methodParameter,container,new ServletWebRequest(multiRequest),factory);System.out.println("[" + methodParameter.getParameterIndex() + "]" + methodParameter.getParameterType().getSimpleName() + " " + methodParameter.getParameterName() + "->" + v);
}else{System.out.println("[" + methodParameter.getParameterIndex() + "]" + methodParameter.getParameterType().getSimpleName() + " " + methodParameter.getParameterName());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程引发的安全问题

前言👀~ 上一章我们介绍了线程的一些基础知识点,例如创建线程、查看线程、中断线程、等待线程等知识点,今天我们讲解多线程下引发的安全问题 线程安全(最复杂也最重要) 产生线程安全问题的原因 锁(重要…

左耳听风_116_115_Go_编程模式Kubernetes_Visitor模式

你好,我是陈浩网名左耳多浩子。 这节课呢我们来重点讨论一下cuba netice的酷ver CTL命令它使用到了一个编程模式叫做visitor. Visitor呢是面向对象模式中一个很重要的设计模式。 那这个模式呢是将算法与操作对象的结构分离的一种方法。 那这种分离的实际结果呢是…

Python基础之错误和异常讲解

文章目录 1 错误和异常1.1 简介1.1.1 语法错误1.1.2 异常 1.2 抛出异常1.2.1 抛出原装异常1.2.2 assert异常1.2.3 抛出用户自定义异常 1.3 异常处理1.3.1 try/except1.3.2 try/except...else1.3.3 try-finally 语句1.3.4 with 关键字 1.4 分析记录错误1.4.1 分析错误1.4.2 记录…

Hive笔记-6

6.2.8 聚合函数 1) 语法 count(*),表示统计所有行数,包含null值; count(某列),表示该列一共有多少行,不包含null值; max(),求最大值,不包含null,除非所有值都是null&a…

不同node版本的切换及其指定版本vue-cli脚手架下载

目录 一.清空本地已安装node.js版本 二.装nvm管理工具 三.安装指定node版本 四.使用nvm命令切换或删除指定node版本 五.在指定node版本下下载指定vue-cli脚手架 一.清空本地已安装node.js版本 1.按健winR弹出窗口,键盘输入cmd,然后敲回车。 2.输入…

win11 + ubuntu linux双系统:开机直接进入windows修复

https://zhuanlan.zhihu.com/p/666702893 这种 双系统直接进入win 的问题,应该属于引导坏了,即grub坏了。 原因:笔记本送修了,没拆掉硬盘,可能引导被售后搞坏了。 在win-磁盘管理中查看分区,linux的分区…

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…

8.javaSE基础进阶_泛型generics(无解通配符?+上下界统配符superextends)

文章目录 泛型generics一.泛型简介二.泛型类1.泛型方法 三.泛型接口四.泛型进阶1.*<?>无解通配符*2.上界通配符 < ? extends E>3.下界通配符 < ? super E>4.泛型擦除 泛型generics 一.泛型简介 JDK5引入,一种安全机制,编译时检测不匹配类型 特点: 将数…

学编程容易遇到的误区,请提前规避

随着互联网行业的蓬勃发展和编程技术的普及&#xff0c;越来越多的人开始对编程感兴趣。然而&#xff0c;编程学习并非一蹴而就&#xff0c;新手入门时常常会陷入误区&#xff0c;影响学习状态效率。 今天&#xff0c;我们来一起揭开编程学习常见的五大误区&#xff0c;希望能…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

如何激活typora

话不多说&#xff0c;直接上流程。 1、先下载最新的typora安装包&#xff0c;并安装成功。 Typora的安装 &#xff08;1&#xff09;官网下载&#xff1a;https://typora.xnxxxk.cn/index.html?qhclickid777dd93d58082a46 2、下载百度云我上传的两个exe&#xff0c;不大&…

四轮转向控制器与里程计数据计算的实现

在机器人开发中,四轮转向(Four-Wheel Steering,简称4WS)广泛应用于提高车辆的操控性能和运动灵活性。本文将详细介绍如何通过C++代码实现一个四轮转向控制器,并结合里程计数据提供精准的车辆位置信息反馈。 一、头文件与命名空间 我们需要包括几个关键头文件来处理数学计…

Host Static Assets in CDN(在CDN中托管静态资源)

Host Static Assets in CDN&#xff08;在CDN中托管静态资源&#xff09; 什么是CDN&#xff1f; CDN&#xff08;内容分发网络&#xff0c;Content Delivery Network&#xff09;是一种分布式的网络基础设施&#xff0c;用于高效地分发内容。CDN在全球多个数据中心部署缓存服…

嵌入式实验---实验五 串口数据接收实验

一、实验目的 1、掌握STM32F103串口数据接收程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、STM32F103R6能通过查询中断方式接收数据&#xff0c;每接收到一个字节&#xff0c;立即向对方发送一个相同内容的字节&#xff0c;并把该字节的十六进…

Node.js的介绍与使用(附聊天案例)

Node.js 是一个基于 Chrome V8 JavaScript 引擎的开源、跨平台运行时环境。它使开发者可以在服务器端运行 JavaScript&#xff0c;从而实现全栈开发&#xff0c;即在客户端和服务器端都使用同一种编程语言。 主要功能和用途 服务器端开发&#xff1a;Node.js 主要用于构建高性…

Dahlia Hart: Stylized Casual Character(休闲角色模型)

此包包含两个发型和两个服装&#xff0c;每个都有多种颜色选择。每个发型都适合与物理资源一起使用&#xff0c;并包含各种表情和音素混合形状。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍

目录 引言 Fine-tuning技术的原理阐 预训练模型 迁移学习 模型初始化 模型微调 超参数调整 任务设计 数学模型公式 Dify平台介绍 Dify部署 创建AI 接入大模型api 选择知识库 个人主页链接&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 Fine-tuning技术允许用户根…

【ES】--Elasticsearch的高亮模式

目录 一、高亮策略1、Fast Vector Highlighter(快速向量高亮器)2、Posting Highlighter(帖子高亮器)3、Unified Highlighter(统一高亮器)4、Plain Highlighter(普通高亮器)5、总结二、高亮参数三、高亮案例解析1、words_one配置解析2、words_two配置解析3、words_three…

数据分析-常用模型-RFM模型

一、RFM模型的底层逻辑 漏斗模型中&#xff0c;大部分业务都是按流程推进&#xff0c;可以做漏斗分析。但是&#xff0c;大家有没有想过一个问题&#xff1a; 如果没有转化过程记录&#xff0c;该怎么办&#xff1f;如果用户行为频率很高&#xff0c;有几十个漏斗&#xff0c…

SysBench在windows下的压力测试教程(排坑,综合)

SysBench在windows下的压力测试教程 1.环境配置 官方开源 https://github.com/akopytov/sysbench 由于sysbench已经放弃了在windows上支持,所以可以构建windows下的linux系统进行测试(wsl),环境配置流程为:首先安装wsl,之后在wsl中安装sysbench,mysql,进一步在通过wsl连接主机…