必须用到的枚举工具类

使用背景

spring mvc 接收或者序列化枚举类型时, 默认是根据枚举的名称(string)进行序列化或者反序列化。
但是在实际开发当中,我们一般用枚举代表某一个数值,数据库存储值。 同时我们也希望和前端交互用数值交互,而不是string名称。因此用到这个工具类
支持以下几个组件的反序列化和序列化

  • spring convert
    @RequestParam
    @PathVariable
    ...
  • jackson
    @ResponseBody
  • fastjson
    JSON.parseObject(...)

代码

使用方式

springConverter组件的使用

spring 接收参数为form表单请求时,默认用的converter组件进行转换对象

1
2
3
4
5
6
7
8
@Configuration
public class AddEnumConverter implements WebMvcConfigurer {

@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(EnumDeserializerImpls.ENUM_DESERIALIZER_CONVERTER);
}
}

jackson序列化和反序列化的使用

spring的@RequestBody,@ResponseBody 默认使用jackson进行反序列化和序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class AddEnumJacksonModule implements WebMvcConfigurer {

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

for (HttpMessageConverter<?> converter : converters) {
if (!(converter instanceof MappingJackson2HttpMessageConverter)) {
continue;
}
((MappingJackson2HttpMessageConverter) converter).getObjectMapper()
.registerModule(EnumDeserializerImpls.ENUM_MODULE);
}
}
}

fastJson的使用

1
2
3
4
// 序列化
ParserConfig.getGlobalInstance().register(EnumDeserializerImpls.FASTJSON_MODULE);
// 反序列化
SerializeConfig.getGlobalInstance().register(EnumDeserializerImpls.FASTJSON_MODULE);

总结

我们定义好通用枚举之后,所有枚举实现通用枚举的接口。在定义枚举的序列化实现,然后在定义各自(反)序列化框架的实现
最后我们把各种(反)序列化枚举的实现配置到spring容器中,最终才生效。
这样配置好之后呢,可以直接用枚举当做接收参数和返回参数了。前端交互用的还是数值类型哦。
这样针对老项目重构的时候可以在不影响前端的情况下,后端全部可以改成枚举哦。

数据库枚举的序列化和反序列化-mybatisPlus目前是直接支持的。参考mybatisPlus的文档即可。但是前端交互用数值的话需要配合此代码才行哦