学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
本文是我的《学透Spring Boot》专栏的第16篇文章,了解更多请移步我的专栏:
Postnull的专栏《学透Spring Boot》
目录
遇到问题
日期格式的转换
实现需求
创建转换器
注册转换器
编写Controller
访问测试
存在的问题
解决问题
源码分析
总结
遇到问题
本着没有问题也要制造问题的学习态度,我们今天通过实现一个需求来学习Spring MVC的类型转换。

我们希望通过http请求的参数 month=4,到MVC接收时自动变成 month=四月份。


能不能实现呢?
当然可以,一般的做法是接收到参数month=1,然后再控制器中手动转换。

但是这样不够优雅,我们需要把手动变全自动。
日期格式的转换
其实当然可以,因为Spring MVC已经这么做了。
MVC可以自动把我们请求中的字符串的日期,变成Controller方法中的日期对象。

我们的controller接收到date变量时,会自动转成LocalDate对象

实现需求
Spring MVC实现日期类型的自动转换,是通过一个组件ConversionService,我们可以称之为类型转换器。
如果我们要如果要添加配置类型转换器,需要继承WebMvcConfigurer接口,然后注册我们自定义的转换器。
创建转换器

注册转换器

编写Controller

访问测试

大功告成!只要分2步即可
- 定义转换器
- 注册转换器
然后参数就会自动的转换了。
存在的问题
但是这种方式不是完美无缺的,有个致命的问题。
因为我们的转换器,它是全局有效的,也就是说把所有的string入参,都会走MonthConverter转换成月份。它只看参数,不看参数名!
所以另外一个接口

它也走MonthConverter,这不是我们预期的。整个应用所有的string变量,都转换成月份,这还得了呢

解决问题
既然,Spring MVC转换器关注的是参数类型,那我们把转出类型换成特殊类型即可。
定义一个专门的类型,作为接收参数类型

把转换器的转换结果类型变成我们自定义类

重构controller,把入参类型变成自定义类型

然后访问,没有问题

访问其它的接口,入参是String类型,也没有受到我们自定义转换器的影响

总结,转换器关注的是转换前后的类型,我们定制一个专门的转出类型,就不会影响其它的接口了。
源码分析
我们知道如何定义和使用转换器了。但我们还想在了解Spring Boot如何实现的。
启动类

启动时会配置类型转换服务

转换服务中会注册“转换器”和“格式器”

这个addConverts是不是有点眼熟,我们之前也需要手动注册转换器

debug,我们看看有哪些内置的转换器

其中就包含了我们自定义的转换器

总结
本文我们通过编写并注册自定义的转换器,实现了请求参数的自动转换。通过这个例子,我们可以很好的了解Spring MVC的类型转换机制。
相关文章:
学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
本文是我的《学透Spring Boot》专栏的第16篇文章,了解更多请移步我的专栏: Postnull的专栏《学透Spring Boot》 目录 遇到问题 日期格式的转换 实现需求 创建转换器 注册转换器 编写Controller 访问测试 存在的问题 解决问题 源码分析 总结 …...
Spring Boot开发三板斧:高效构建企业级应用的核心技法
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,…...
人脸考勤管理一体化系统(人脸识别系统,签到打卡)
人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架,基于Flask轻量级Web框架搭建后端服务…...
大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧
目录 背景一、Hive基础查询核心语法1. 基础查询(SELECT & FROM)2. 条件过滤(WHERE)3. 聚合与分组(GROUP BY & HAVING)4. 排序与限制(ORDER BY & LIMIT) 二、复杂查询实战…...
手搓多模态-03 顶层和嵌入层的搭建
声明:本代码非原创,是博主跟着国外大佬的视频教程编写的,本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分,这一部分的主要功能是接收一个batch的图像,并将其转化为上下文相关的嵌入向量,…...
【经验分享】将qt的ui文件转换为py文件
🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 首先简单的设计一个U…...
常用的国内镜像源
常见的 pip 镜像源 阿里云镜像:https://mirrors.aliyun.com/pypi/simple/ 清华大学镜像:https://pypi.tuna.tsinghua.edu.cn/simple 中国科学技术大学镜像:https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣镜像:https://pypi.doub…...
探秘JVM内部
在我们编写Java代码,点击运行后,会发生什么事呢? 首先,Java源代码会经过Java编译器将其编译成字节码,放在.class文件中 然后这些字节码文件就会被加载到jvm中,然后jvm会读取这些文件,调用相关…...
在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
大家好,我是 V 哥。 《鸿蒙 HarmonyOS 开发之路 卷1 ArkTS篇》已经出版上市了哈,有需要的朋友可以关注一下,卷2应用开发篇也马上要出版了,V 哥正在紧锣密鼓的写鸿蒙开发实战卷3的教材,卷3主要以项目实战为主࿰…...
利用空间-运动-回波稀疏性进行5D图像重建,以实现自由呼吸状态下肝脏定量磁共振成像(MRI)的加速采集|文献速递--深度学习医疗AI最新文献
Title 题目 5D image reconstruction exploiting space-motion-echo sparsity foraccelerated free-breathing quantitative liver MRI 利用空间-运动-回波稀疏性进行5D图像重建,以实现自由呼吸状态下肝脏定量磁共振成像(MRI)的加速采集 …...
Qt5 Mac系统检查休眠
在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt5.10中检测到系统是否休眠以及在Mac上实现这一功能。本文将深入…...
ZKmall开源商城B2B2C电商用户隐私信息保护策略:数据脱敏全链路实践
随着业务的不断拓展和用户规模的持续扩大,用户隐私信息的保护也面临着前所未有的挑战。下面将深入探讨ZKmall开源商城在数据脱敏方面的实践,以及针对B2B2C电商用户隐私信息的具体保护策略。 数据脱敏,又称数据去标识化或数据匿名化࿰…...
Media streaming mental map
Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…...
linux Gitkraken 破解
ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...
SSL证书颁发机构有哪些呢
证书颁发机构(Certificate Authority, CA)是负责签发和管理数字证书的权威机构,分为公共信任的 CA 和私有/内部 CA。以下是常见的公共信任的 CA 分类及代表机构: 1. 国际知名公共 CA(浏览器/操作系统默认信任ÿ…...
13_pandas可视化_seaborn
导入库 import numpy as np import pandas as pd # import matplotlib.pyplot as plt #交互环境中不需要导入 import seaborn as sns sns.set_context({figure.figsize:[8, 6]}) # 设置图大小 # 屏蔽警告 import warnings warnings.filterwarnings("ignore")关系图 …...
Pgvector的安装
Pgvector的安装 向量化数据的存储,可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意:在安装vector扩展之前,请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址: https://visualstudio.microso…...
如何在大型项目中组织和管理 Vue 3 Hooks?
众所周知,Vue Hooks(通常指 Composition API 中的功能)是 Vue 3 引入的一种代码组织方式,用于更灵活地组合和复用逻辑。但是在项目中大量使用这种写法该如何更好的搭建结构呢?以下是可供参考实践的案例。 一、Hooks 组织原则 单一职责每个 Hook 应专注于完成单一功能,避…...
Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)
上文有介绍deepseek接入,但是需要 付费,虽然 sliconflow 可以白嫖 token,但是毕竟是有限的,本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火(免费) 测试对话 接入Django 扩展建议 接入讯飞星火…...
路由器学习
路由器原理 可以理解成把不同的网络打通,实现通信的设备。比如家里的路由器,他就是把家里的内网和互联网(外网)打通。 分类 1.(按应用场景分类) 路由器分为家用的,企业级的,运营…...
Redis 连接:深入解析与优化实践
Redis 连接:深入解析与优化实践 引言 Redis 作为一款高性能的键值型数据库,广泛应用于缓存、会话存储、消息队列等领域。Redis 的连接管理是确保其性能和稳定性的关键。本文将深入探讨 Redis 连接的原理、配置、优化方法以及常见问题,帮助您更好地掌握 Redis 连接技术。 …...
UE5学习记录part14
第17节 enemy behavior 173 making enemies move: AI Pawn Navigation 按P查看体积 So its very important that our nav mesh bounds volume encompasses all of the area that wed like our 因此,我们的导航网格边界体积必须包含我们希望 AI to navigate in and …...
【中间件】使用ElasticSearch提供的RestClientAPI操作ES
一、简介 ElasticSearch提供了RestClient来操作ES,包括对数据的增删改查,可参照官方文档:Java High Level REST Client 二、使用步骤: 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...
Docker的备份与恢复
一、两种基本方式 docker export / import 在服务器上导出容器docker export container_name > container_backup.tar这里使用 > 重定向时默认保存路径为当前运行命令的路径,可以自行指定绝对路径来保存,后续加载时也使用对应的路径即可。 恢复为…...
C++ string 对象的操作(三十五)
1. string 对象的常见操作 下面的表格列出了 string 类型最常用的一些操作以及它们的功能: 操作说明示例os << s将字符串对象 s 写入输出流 os,返回 os。std::cout << s;is >> s从输入流 is 中读取字符串赋给 s(以空白分…...
DAPP实战篇:规划下我们的开发线路
前言 在DApp实战篇:先用前端起个项目一文中我们起了一个前端项目,在后续开发中笔者将带领大家一步步完成这个DAPP,为了方便后续讲解,本篇将完整说明后续我们要进行的开发和思路。 主打前端 实际上一个完整的DAPP是由前端和智能…...
[leetcode] 面试经典 150 题——篇9:二叉树(番外:二叉树的遍历方式)
二叉树的遍历是指按照某种顺序访问二叉树中的每个节点。常见的遍历方式有四种:前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)以及层序遍历&am…...
【Elasticsearch】开启大数据分析的探索与预处理之旅
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
状态机思想编程练习
状态机实现LED流水灯 本次实验,我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯,并通过Modelsim来进行模拟仿真,再到DE2-115开发板上进行验证。 首先进行主要代码的编写。 module led (input sys_clk,input sys_…...
C#:接口(interface)
目录 接口的核心是什么? 1. 什么是接口(Interface),为什么要用它? 2. 如何定义和使用接口? 3.什么是引用接口? 如何“引用接口”? “引用接口”的关键点 4. 接口与抽象类的区…...
