【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 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8266 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡6 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne8 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_8 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs9 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲9 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261689 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail10 小时前
05 管理活动与选品
java