| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring MVC Controller 方法参数 Map 的实现类是什么? -> 正文阅读 |
|
[Java知识库]Spring MVC Controller 方法参数 Map 的实现类是什么? |
这是我回答的来自 CSDN 问答平台的一个问题,由于问题相对比较有深度,恰好最近几篇文章都是在总结 controller 方法参数,因此在原回答的基础上再次整理归纳。 问题题主问题描述如下: 在SpringBoot中,Controller的参数中有Map接口类型的,请问他的实现类是什么? 突发奇想,在SpringBoot中,Controller的参数中有Map接口类型的
像这里的map,声明是Map接口,那他的实现类是什么? 分析题主提到 SpringBoot 中的 Controller 参数,可以推测题主在学习 Spring 框架时跳过了 Spring MVC 直接上手的 Spring Boot。自从 Spring Boot 框架推出之后,确实简化了 Spring 的使用,这也让很多人忽略了框架底层的实现。 Spring Boot 基于 Spring Framework,Spring MVC 正是 Spring Framework 框架中的其中一个模块。Controller 并非 Spring Boot 的专利,要回答题主的问题,还是需要回归到 Spring MVC,Spring MVC 环境已经支持了 Controller 方法使用不同的参数类型。 Spring MVC 中的 Controller 方法参数多用来接收请求有关的信息,还有一部分和 MVC 有关,能定义的请求相关参数可以参见《深入理解 Spring MVC Controller —— 请求参数获取》。 对于不同类型参数的解析,Spring MVC 使用的是 HandlerMethodArgumentResolver,默认情况下的实现及能处理的参数见下图。 回答因此具体到 Controller 方法的 Map 类型的参数实现,要看 HandlerMethodArgumentResolver 如何解析的,默认情况下解析 Map 类型的 HandlerMethodArgumentResolver 主要分下面几种情况。 1. 携带指定了 name 的 @RequestParam 注解的 Map 类型这种情况下的参数由 RequestParamMethodArgumentResolver 进行解析,不过由于默认情况下 Spring 无法将 String 转换为 Map,因此会报错。如果添加了支持 String 到 Map 类型转换服务,则 Map 实现由具体的类型转换服务决定。
2. 携带未指定 name 的 @RequestParam 注解的 Map 类型参数这种情况下的参数由 RequestParamMapMethodArgumentResolver 进行解析,支持的 Map 泛型类型包括 3. 携带指定了 name 的 @PathVariable 注解的 Map 类型参数这种类型的 Map 参数由 PathVariableMethodArgumentResolver 进行解析,由于默认情况下 Spring 无法将路径中的字符串变量转换为 Map,因此同样会报错。如果添加了支持 String 到 Map 类型转换服务,则 Map 实现由具体的类型转换服务决定。
4. 未携带 name 的 @PathVariable 注解的 Map 类型参数这种情况下的 Map 参数由 PathVariableMapMethodArgumentResolver 进行解析,Spring 使用的实现同样为 5. 携带指定了 name 的 @MatrixVariable 注解的 Map 类型参数这种情况的 Map 参数由 PathVariableMapMethodArgumentResolver 进行解析,由于默认情况下 Spring 无法将路径中的字符串变量转换为 Map,因此同样会报错。如果添加了支持 String 到 Map 类型转换服务,则 Map 实现由具体的类型转换服务决定。
6. 未携带 name 的 @MatrixVariable 注解的 Map 类型参数这种情况下的 Map 参数由 MatrixVariableMapMethodArgumentResolver 解析,这种情况下的 Map 参数实现为 7. 未携带任何注解的 Map 类型不带注解的 Controller 方法中的 Map 参数被 Spring 认为是 MVC 中的 Model,由 MapMethodProcessor 进行解析,相关代码如下。
BindingAwareModelMap 和 ModelMap 都实现了 LinkedHashMap,这也意味着如果你使用 TreeMap 作为参数,由于类型不匹配将会导致程序报错。 8. 携带 @RequestBody 注解的 Map 参数带 总结Spring MVC 对于 Map 类型的 Controller 方法参数,多数情况下使用 LinkedHashMap 作为实现,这样可以保证参数有序,兼容了程序获取指定索引位置参数的情况。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:49:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |