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枚举类型转换
后端和前端的类型转换
