当前位置: 首页 > news >正文

如何使用SpringBoot 自定义转换器

😀前言
本篇博文是关于SpringBoot 自定义转换器的使用,希望你能够喜欢😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

  • 自定义转换器
    • 基本介绍
    • 自定义转换器-应用实例
      • 代码实现
      • 测试
      • Debug 查看新增的Converter
      • 注册转换器换种写法-方便理解
    • 😄总结

自定义转换器

基本介绍

  1. SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器

  2. SpringBoot 也支持自定义转换器, 这个内置转换器在debug 的时候, 可以看到 提供了124 个内置转换器.

  3. 看下源码GenericConverter-ConvertiblePair

GenericConverter里面有一个内部类ConvertiblePair,自定义转换器时他的两个类型属性需要我们去指定。

  1. image-20230813120137532

image-20230813115316814

image-20230813120534010

自定义转换器-应用实例

需求说明: 演示自定义转换器使用

image-20230813121203863

代码实现

  1. 修改save.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>添加妖怪</title></head><body><h1>添加妖怪-坐骑[测试封装POJO;]</h1><form action="/savemonster" method="post">编号: <input name="id" value="100"><br/>姓名: <input name="name" value="牛魔王"/> <br/>年龄: <input name="age" value="500"/> <br/>婚否: <input name="isMarried" value="true"/> <br/>生日: <input name="birth" value="2000/11/11"/> <br/><!-- 使用自定义转换器关联car, 字符串整体提交, 使用,号间隔  -->坐骑:<input name="car" value="避水兽,66666.6"><br/><!--    坐骑:<input name="car.name" value="奔驰"/><br/>--><!--    价格:<input name="car.price" value="9999.9"/>--><input type="submit" value="保存"/></form></body>
</html>
  1. 创建src\main\java\com\nlc\web\config\WebConfig.java,增加自定义转换器-
/*** @Configuration(proxyBeanMethods = false)* 1. 表示 WebConfig 是一个配置类* 2. proxyBeanMethods = false 使用Lite模式*/
@Configuration(proxyBeanMethods = false)
public class WebConfig  {//注入bean WebMvcConfigurer@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addFormatters(FormatterRegistry registry) {/*** 解读* 1. 在addFormatters 方法中,增加一个自定义的转换器* 2. 增加自定义转换器 String -> Car* 3. 增加的自定义转换器会注册到 converters 容器中* 4. converters 底层结构是 ConcurrentHashMap 内置有124转换器* 5. 一会会使用debug来看到这些转换器*///使用匿名内部类添加registry.addConverter(new Converter<String, Car>() {@Overridepublic Car convert(String source) {//source就是 传入的字符串 避水兽,66666.6//这里就加入你的自定义的转换业务代码if (!ObjectUtils.isEmpty(source)) {Car car = new Car();String[] split = source.split(",");car.setName(split[0]);car.setPrice(Double.parseDouble(split[1]));return car;}return null;}});}};}
}

测试

完成测试, 浏览器http://localhost:8080/save.html

image-20230813121938460

image-20230813122026218

Debug 查看新增的Converter

image-20230813122138132

image-20230813122159910

image-20230813122229942

------注意看, 多了一个我们自定义的转换器String->com.nlc.web.bean.Car

image-20230813145611896

注册转换器换种写法-方便理解

如果上面的方法不好理解可以看看下面

@Configuration(proxyBeanMethods = false)
public class WebConfig  {//注入bean WebMvcConfigurer@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addFormatters(FormatterRegistry registry) {//转种写法来注册自定义转换器-方便理解//1.先创建自定义的转换器Converter<String,Car> hspConverter = new Converter<String, Car>() {@Overridepublic Car convert(String source) {//source就是 传入的字符串 避水金晶兽,666.6//这里就加入你的自定义的转换业务代码if (!ObjectUtils.isEmpty(source)) {Car car = new Car();String[] split = source.split(",");car.setName(split[0]);car.setPrice(Double.parseDouble(split[1]));return car;}return null;}};//2添加转换器到converters key-[源类型->目标类型]registry.addConverter(hspConverter);}};}
}

也可以有多个转换器,但是不能有相同的k,k是唯一的。如果有两个相同的k,第二个会自动替换第一个。

😄总结

  1. 转换器是已k-v的形式存放,k是唯一的,如果有多个相同k的转换器,会被下一个转换器替代。
  2. 自定义转换器的业务代码是由程序员决定。
  3. 创建自定义转换器后不要忘记添加转换器到converters。

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

相关文章:

如何使用SpringBoot 自定义转换器

&#x1f600;前言 本篇博文是关于SpringBoot 自定义转换器的使用&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…...

多线程(进阶)

一、常见的锁策略 1.1读写锁 多线程之间&#xff0c;数据的读取方之间不会产生线程安全问题&#xff0c;但数据的写入方互相之间以及和读者之间都需 要进行互斥。如果两种场景下都用同一个锁&#xff0c;就会产生极大的性能损耗。所以读写锁因此而产生。 读写锁&#xff08;r…...

端口输入的数据为什么要打拍?

一次作者在开发图像时候&#xff0c;对输入的图像没有打拍&#xff0c;直接输出给显示终端&#xff0c;时好时坏&#xff0c;或者图像颜色不正确&#xff0c;最终经过打拍解决了此问题。 //配置为16-Bit SDR ITU-R BT.656模式时pixel_data[23:16]为高阻。always (posedge pixe…...

Qt读写Excel--QXlsx编译为静态库2

1、概述&#x1f954; 在使用QXlsx时由于源码文件比较多&#xff0c;如果直接加载进项目里面&#xff0c;会增加每次编译的时间&#xff1b; 直接将源码加载进项目工程中&#xff0c;会导致项目文件非常多&#xff0c;结构变得更加臃肿&#xff1b; 所以在本文中将会将QXlsx编译…...

win11电脑查找已连接打印机ip的方法

此方法适用于驱动打印机&#xff0c;windows 11操作系统。 方法一&#xff1a;直接查看法 首先大家可以看看自己的打印机有没有lcd屏幕。有些直接在屏幕显示ip&#xff1b;另一种进入菜单&#xff0c;然后可以在里面的选项中显示“ip地址”。 方法二&#xff1a;设置中查看 …...

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言&#xff1a; 测试开发目标&#xff1a; "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试&#xff1a;Selenium JUnit 接口测试&#xff1a;Postman 测试用例的设计与实现 自动化测试演示&#xff1a; 用例一&#xff1a;登…...

图片增强组件实现

设计并实现了一个图片增强的组件&#xff0c;具体功能如下&#xff1a; 图片数据增强&#xff0c;包括且不限于&#xff1a;图片旋转、比例增强、高斯噪声、饱和度变换等若图片包含对应标注boundingbox&#xff0c;也支持对应变换&#xff0c;保证圈选内容的不变性实现多种方式…...

go.sum are different when using go mod vendor/download

本地Golang配置 今天本地编译一个项目&#xff0c;遇到以下错误 PS D:\Code\Golang\jiankunking\k8s-ext> go mod tidy go: downloading github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.4incompatible verifying github.com/gin-gonic/ginv1.7.3: checksum mismat…...

Docker技术入门教程

Docker技术入门教程 一、docker概念 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发运维之间的协作我们需要关心很多东西&#xff0c;这也是很多互联网公司都不得不面对的问题&#xff0c;特别是各种版本的迭代之后&a…...

Vue2-组件,组件的使用及注意点,组件嵌套,VueComponent构造函数,单文件组件

&#x1f954;&#xff1a;功不唐捐 更多Vue知识请点击——Vue.js VUE-Day5 组件与使用组件的三大步1、定义组件(创建组件)2、注册组件①局部注册②全局注册 3、使用组件小案例&#xff1a; 使用组件的一些注意点1.关于组件名2.关于组件标签3.一个简写方式 组件的嵌套VueCompon…...

IntelliJ IDEA Bookmark使用

1 增加 右键行号栏 2 查看 从favorite这里查看 参考IntelliJ IDEA 小技巧&#xff1a;Bookmark(书签)的使用_bookmark idea 使用_大唐冠军侯的博客-CSDN博客...

kriging-contour前端克里金插值

先看效果&#xff1a; 本项目在kriging-contour插件基础上进行了封装&#xff0c;增加了自定义区域插值&#xff0c;gitbub地址。...

第八章 CUDA内存应用与性能优化篇(中篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...

适用于物联网 (IoT)的远距离、低功耗、低速率WiFi—Wi-Fi HaLow

1. Wi-Fi 简介 Wi-Fi&#xff08;Wireless Fidelity&#xff09;是目前较为常见的无线通信方式&#xff0c;承载着一半以上的互联网流量。Wi-Fi是一个总称&#xff0c;涵盖了802.11通信协议系列&#xff0c;由Wi-Fi联盟持有并推动其发展。802.11通信协议发展至今已逾二十年&am…...

【解读Spikingjelly】使用单层全连接SNN识别MNIST

原文档&#xff1a;使用单层全连接SNN识别MNIST — spikingjelly alpha 文档 代码地址&#xff1a;完整的代码位于activation_based.examples.lif_fc_mnist.py GitHub - fangwei123456/spikingjelly: SpikingJelly is an open-source deep learning framework for Spiking Neur…...

穿越数字奇境:探寻元宇宙中的科技奇迹

随着科技的迅速发展&#xff0c;元宇宙正逐渐成为一个备受关注的话题&#xff0c;它不仅是虚拟现实的延伸&#xff0c;更是将现实世界与数字世界融合的未来典范。在这个神秘而充满活力的数字奇境中&#xff0c;涉及了众多领域和技术&#xff0c;为我们呈现出了一个无限的创新和…...

2024」预备研究生mem-阴影图形

一、阴影图形 二、课后题...

【设计模式】责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…...

解密人工智能:线性回归 | 逻辑回归 | SVM

文章目录 1、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 2、线性回归算法2.1 线性回归的假设是什么&#xff1f;2.2 如何确定线性回归模型的拟合优度&#xff1f;2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法3.1 什么是逻辑函数?…...

【FFMPEG应用篇】使用FFmpeg的常见问题

拼接视频的问题 在使用ffmpeg进行视频拼接时&#xff0c;可能会遇到一些常见问题。以下是这些问题及其解决方法&#xff1a; 1. 视频格式不兼容&#xff1a;如果要拼接的视频格式不同&#xff0c;ffmpeg可能会报错。解决方法是使用ffmpeg进行格式转换&#xff0c;将所有视频转…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...