tips : 解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 从 3.5.2 版本开始只需完成 下面步骤 即可使用
如果是低版本需要配置
mybatis-plus:
# 扫描通用枚举 从 3.5.2 开始无需配置
type-enums-package: com.eden.**.enums
声明通用枚举属性
方式一: 使用 @EnumValue 注解枚举属性
EnumValue 和 JsonValue 可以是一个字段
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue//标记数据库存的值是code
private final int code;
@JsonValue //标记响应json值
private final String descp;
}
方式二: 枚举属性,实现 IEnum 接口如下:
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
private int value;
@JsonValue //标记响应json值
private String desc;
//标记数据库存的值是code
@Override
public Integer getValue() {
return this.value;
}
}
需要特别注意的是 :当你没有使用注解标记响应json值,两种方式任选其一,然后在枚举中复写 toString 方法即可.
#二、注解处理
- springboot
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer(){
return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
}
- jackson
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
当你使用实现 IEnum 接口 ,复写 toString 是无效的,他这里复写了Object对象的toString方法,导致并未生效
super.name() 方法 : 返回:该enum常量的名称
返回此enum常量的名称,与在其enum声明中声明的名称完全一致。大多数程序员应该优先使用toString方法,因为toString方法可能返回一个更用户友好的名称。该方法主要用于特定的情况,在这种情况下,正确性依赖于获得准确的名称,而名称不会随版本的不同而变化。
实体属性使用枚举类型
public class User {
/**
* 名字
* 数据库字段: name varchar(20)
*/
private String name;
/**
* 年龄,IEnum接口的枚举处理
* 数据库字段:age INT(3)
*/
private AgeEnum age;
/**
* 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
最后 大家可以根据自己喜好选择
问题 :如果前端传的值是枚举中的字符串,进入后端会转换成枚举参与运行,存入数据库时会转换成字符串对应的数字。但如果前端传入的是"",而不是null,因找不到对应的枚举值,匹配出现异常。
Jackson :
/**
* Web MVC配置
*
* @author eden
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(new ResourceHttpMessageConverter());
converters.add(new AllEncompassingFormHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(jackson2HttpMessageConverter());
}
/**
* 枚举字段可以使用null、空字符串、非匹配的任意字符串进行传参,而不引发异常
*/
@Bean
@Order(0)
public ObjectMapper myObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 解决enum不匹配问题 默认值为false
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
return objectMapper;
}
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = myObjectMapper();
// 忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 统一日期格式转换,不建议开启
//mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN));
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
converter.setObjectMapper(mapper);
return converter;
}
}