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

SpringBoot-自定义转换器

SpringBoot-自定义转换器

1.基本介绍

  1. SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器
  2. SpringBoot 也支持自定义转换器, 这个内置转换器在 debug 的时候, 可以看到, 提供了 124 个内置转换器. 看下源码 GenericConverter-ConvertiblePair

image-20220806150256033

image-20220806150407794

2.自定义类型转换器—应用实例

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

image-20220806143759738

2.代码实现

1.修改src\main\resources\static\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="120"/> <br/>婚否: <input name="isMarried" value="true"/> <br/>生日: <input name="birth" value="2000/11/11"/> <br/><!-- 使用自定义转换器关联car, 字符串整体提交, 使用,号间隔  -->坐骑:<input name="car" value="避水金晶兽,666.6"><br/><input type="submit" value="保存"/>
</form>
</body>
</html>

2.修改src\main\java\com\llp\springboot\controller\ParameterController.java

@PostMapping("/savemonster")
public String saveMonster(Monster monster) {//monster= Monster(id=100, name=牛魔王, age=120, isMarried=true, birth=Sat Nov 11 00:00:00 CST 2000, car=Car(name=避水金晶兽, price=666.6))System.out.println("monster= " + monster);return "success";
}

3.自定义一个类型转换器src\main\java\com\llp\springboot\config\WebConfig.java

/*** 开启lite模式,通过容器获取bean时将是多例的*/
@Configuration(proxyBeanMethods = false)
public class WebConfig {@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addFormatters(FormatterRegistry registry) {/*** 1. 在addFormatters 方法中,增加一个自定义的转换器* 2. 增加自定义转换器 String -> Car* 3. 增加的自定义转换器会注册到 converters 容器中* 4. converters 底层结构是 ConcurrentHashMap 内置有124转换器*/registry.addConverter(new Converter<String, Car>() {@Overridepublic Car convert(String content) {if (!ObjectUtils.isEmpty(content)) {//避水金晶兽,666.6String[] split = content.split(",");String name = split[0];double price = Double.parseDouble(split[1]);return new Car(name, price);}return null;}});}};}}

image-20220806150738381

3.注意事项及使用细节

1.我们可以定义多个自定义转换器

/*** 开启lite模式,通过容器获取bean时将是多例的*/
@Configuration(proxyBeanMethods = false)
public class WebConfig {@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addFormatters(FormatterRegistry registry) {Converter<String, Car> carConverter1 = new Converter<String, Car>() {@Overridepublic Car convert(String content) {if (!ObjectUtils.isEmpty(content)) {//避水金晶兽,666.6String[] split = content.split(",");String name = split[0];double price = Double.parseDouble(split[1]);return new Car(name, price);}return null;}};Converter<String, Monster> monsterConverter = new Converter<String, Monster>() {@Overridepublic Monster convert(String s) {return null;}};Converter<String, Car> carConverter2 = new Converter<String, Car>() {@Overridepublic Car convert(String s) {System.out.println(s);return null;}};registry.addConverter(carConverter1);//carConverter1、carConverter2的key均为 java.lang.String->com.llp.springboot.bean.Car组成//因此carConverter2会覆盖掉carConverter1registry.addConverter(carConverter2);registry.addConverter(monsterConverter);}};}}

2.底层在定义了一变量名为convertes的ConCurrentHashMap用于存储所有的类型转换器,而key是由“原类型->目标类型”构成的,因此当自定义的key相同时会覆盖调之前的类型转换器,这里我们定义了三个自定义转换器但其中两个时相同的key因此只会保留最后一次添加的类型转换器

image-20220806151528451

http://www.lryc.cn/news/2415979.html

相关文章:

  • 怎样才能知道自己的手机是否支持北斗导航?
  • ubuntu11.10 安装oracle
  • 2024年Linux最新Linux系统安装(超级详细教程)
  • C语言基础练习100题(附上详细解答)
  • Web 2.0(维基百科)
  • 安全科普:局域网攻击的常见方法
  • .net 源码地址
  • c++ STL容器 --- 动态数组vector
  • Alerter华丽的消息推送栏
  • myeclipse 8.5 注册码
  • vc画线画框画矩形
  • dmscript.dll文件丢失导致程序无法运行问题
  • 2023 抖音\百度\哔哩哔哩热搜热榜单页HTML源码
  • 六祎-实现微信支付宝QQ钱包三块合一收款码
  • 基于Java游戏在线论坛系统的设计与实现(源码+LW+调试文档+讲解等)
  • shsh备份工具_32位设备有SHSH随意降级平刷教程Windows版
  • [0451]基于JAVA的公益林智慧管理系统的设计与实现
  • 淘宝皇冠店铺大全,淘宝最好的皇冠店铺,淘宝皇冠店铺TOP10
  • UVA1585 Score
  • 浏览器判断是否安装了ios/android客户端程序
  • 谷歌翻译浏览器扩展,替换国内服务器版
  • 网络--传输层TCP、UDP、流量控制、拥塞避免、三次挥手
  • 解决windows防火墙无法更改某些设置 错误代码0X800
  • Chart控件---饼图基本用法
  • 快速排序VS堆排序
  • 光棍节程序员闯关秀 小游戏
  • CBrush
  • JavaScript入门:掌握基础语法
  • Free Pascal不完全攻略之一 :进入FP的世界
  • 编程示例:计算1000的阶乘