你还在为系统中存在魔数而找不到意义而烦恼么?
你还在为数据库存的数值对应java的Interger不知道什么意思而抓狂么?
你还在用Interger前后端传值转化枚举而做重复的代码么?
快来使用枚举转化器吧:跟枚举无关的代码例子中都进行了注释
导入方式:
1.直接使用傻瓜全能包(推荐新手玩家使用,推荐使用新项目,封装的功能较多)
<dependency>
<groupId>io.gitee.chearnee.fw</groupId>
<artifactId>fw-web-spring-boot-starter</artifactId>
<version>0.0.1</version>
</dependency>
介绍:自动开启:统一返回对象处理;LocalDateTIme 系统内外传输正反序列化成时间戳,支持RequestBody方式,RequestParam和PathVariable方式;枚举正反序列化等等等;
2.自定义使用(推荐老玩家使用,自定义加载使用工具,不影响老的项目)
<dependency>
<groupId>io.gitee.chearnee.fw</groupId>
<artifactId>fw-common-tools</artifactId>
<version>0.0.1</version>
</dependency>
介绍:自定义导入,需要手动加到springboot的序列化器中(我这里使用的springboot自带的jackson序列化工具,如果大家使用其他序列化工具,请自行修改)
@Configuration
public class JacksonBaseConfig {
private static void customize(Jackson2ObjectMapperBuilder builder) {
builder
//.serializerByType(LocalDateTime.class,
// new CustomLocalDateTimeSerializer())
// .deserializerByType(LocalDateTime.class,
// new CustomLocalDateTimeDeserializer())
//枚举序列化
.serializerByType(IBaseEnum.class, new BaseEnumSerializer())
//枚举反序列化
.deserializerByType(IBaseEnum.class, new BaseEnumDeserializer())
;
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return JacksonBaseConfig::customize;
}
}
@Configuration
public class MvcBaseConfig implements WebMvcConfigurer {
// @Autowired(required = false)
//private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;
@Override
public void addFormatters(FormatterRegistry registry) {
//param 和 path反序列化
registry.addConverterFactory(new StringToBaseEnumConverterFactory());
//registry.addConverter(new StringToLocalDateTimeConverter());
}
//@Override
//public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//List<HttpMessageConverter<?>> collect = converters.stream()
//.filter(MappingJackson2HttpMessageConverter.class::isInstance).collect(
// Collectors.toList());
//converters.removeAll(collect);
//converters.add(new MappingJackson2HttpMessageConverter(jackson2ObjectMapperBuilder.build()));
}
}
使用方式:
在java中使用枚举的时候,实现IBaseEnum接口就大功告成,
在要进行正反序列化的枚举值上加上@IBaseEnumJson注解,就会以此枚举值来进行正反序列化操作,如果不加@IBaseEnumJson注解,默认以IBaseEnum的getValue来进行操作。
例子:
@Getter
@AllArgsConstructor
public enum SexEnum implements IBaseEnum<Integer> {
UNKNOWN(0, "未知"),
FEMALE(1, "女"),
MALE(2, "男"),
;
//这个为mybatis plus存储到数据库的枚举值
@EnumValue
//这个为正反序列化系统内外的枚举值,如果没有写这个默认正反序列化 getValue()
@IBaseEnumJson
private final Integer value;
private final String desc;
}
由于我们orm主要用mybatis plus,它自带有数据库枚举处理,所以就没有写数据库的枚举值处理,推荐大家使用mybatis plus吧,链接:Myabtis plus 通用枚举处理
通过上述的方式进行处理,在整个系统中就不会出现整型转化枚举,枚举转换整型等问题,整个系统中直接使用枚举进行操作,又少了一些魔数的产生。
今天就主要介绍枚举的处理,后续还有其他提升开发效率的工具介绍。