【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换

095-尚庭公寓-项目开发-后台管理-公寓管理-标签-查询列表-类型转换问题分析_哔哩哔哩_bilibili

使用枚举类

提高可读性,使用枚举类

数据库设计

数据库中,type定义成tinyint类型

实体类

实体类中,对于type字段,定义成枚举类

type字段各种形式

前后端交互

WebDataBinder类型转换

http请求上的参数会被绑定到Controller方法的参数上

前端传来的是数字,Controller方法上是ItemType类型的对象,靠SpringMVC的组件WebDataBinder类型转换

将ItemType类型对象转换成数字1, 因为在数据库中type是tinyint,由Mybatis中的TypeHandler完成

http请求的参数,不分数据类型,所有的参数都是文本

将String类型的值1转换成ItemType时失败

所以问题出在请求流程中,WebDataBinder,方法参数绑定的环节

因为http请求的参数,不分数据类型,所有的参数都是文本,也就是字符串

WebDataBinder枚举类型转换

WebDataBinder提供了从String到枚举类型的转换器

但是String到枚举类型的默认转换规则是根据实例名称转换为枚举对象实例

APARTMENT和ROOM是各自实例的名称

如果给"APARTEMNT"这样的字符串,能够转换成ItemType.APARTMENT实例

但是现在,前端传递type=1或者2(前端传的是字符串),不行

自定义Converter

Spring官网,convert是一个通用的类型转换系统

Spring Type Conversion :: Spring Framework

S代表原始类型,T代表目标类型

​​

获取枚举对象实例

可以用if...else,但如果枚举类中定义的实例很多,就会复杂

枚举类的静态方法(法一)

所有枚举类都有两个静态方法

valueOf(),根据传入的实例名称,返回对应的枚举对象实例

values(),返回枚举类的所有实例对象

​​

反射(法二)

获取class对象,也能调用getEnumConstants()获取枚举实例(反射)

​​​​

向SpringMVC注册自定义的Converter

WebMvcConfigurer是SpringMVC提供的,专门用于自定义配置的接口

只要实现了这个接口,就可以完成各项与SpringMVC相关的配置了

通过registry注册自己的Converter,需要传入自定义Converter对象

**可以直接new者注入实例(推荐)**​​

​

ConverterFactory(统一实现所有枚举类型转换逻辑)

官方文档

Spring Type Conversion :: Spring Framework

​

R表示目标类型的父类

ConverterFactory这个接口,可以负责从S这个原始类型,到R这个类型的所有子类的类型转换

getConverter()方法:

  • 参数:目标类型T的Class对象,代表最终的目标类型
  • 返回值:从原始类型S到目标类型T的Converter转换器

​

为所有枚举类指定父接口

实现ConverterFactory接口时,R填写BaseEnum就行了

​

​

代码

​

注册

​

@EnumValue,@JsonValue

默认情况下

TypeHandler不会自动将枚举实例转成1,HTTPMessageConverter同理

使用注解@EnumValue,@JsonValue解决

​​

TypeHandler枚举类型转换 ​

TypeHandler可枚举类型的默认转换规则是枚举对象实例(ItemType.APARTMENT)和实例名称("APARTMENT")相互映射

把注解@EnumValue添加在code上,就是将枚举实例与code进行映射

后端和数据的类型转换

​

HTTPMessageConverter枚举类型转换

​后端和前端的类型转换

​

相关推荐
一条泥憨鱼5 小时前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
从琳开始9895 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
文丑颜不良啊5 小时前
LeetCode1861~1880题目解析
java·leetcode
Flynn Liang6 小时前
AgentScope Java 深度解析:ReActAgent、HarnessAgent 与多智能体编排——JVM 上的自治 Agent 底座
java·大模型·架构设计·ai agent·spring ai·langchain4j·agentscope
Flynn Liang6 小时前
上线后怎么排查 AI 调用?Spring AI Observability:token/延迟/成本埋点与全链路追踪
java·人工智能·spring·监控·可观测性·observability·springai
文丑颜不良啊6 小时前
LeetCode1921~1940题目解析
java·leetcode
Tt有了t6 小时前
设计模式速查
java·python·设计模式
Thomas.Sir6 小时前
第15课:SpringBoot连接池详解:HikariCP配置、调优、监控,4.x连接池新特性
java·spring boot
VimorphTech7 小时前
每批开 4 个线程,为什么限制不住 TTS 的总并发?
java·spring boot·spring
Pniubi7 小时前
Java为什么要分堆和栈
java·开发语言