【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枚举类型转换

​后端和前端的类型转换

相关推荐
StockTV1 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子1 小时前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路2 小时前
C++20概述
java·开发语言·c++20
Championship.23.242 小时前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
橘子海全栈攻城狮2 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken2 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
冷雨夜中漫步3 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿3 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
one_love_zfl4 小时前
java面试-微服务组件篇
java·微服务·面试