枚举映射数据库字段
配置枚举包扫描路径
mybatis-plus:
# 扫描通用枚举
type-enums-package: com.xx.**.enums
方法一:@EnumValue 和 @JsonValue
在枚举中使用注解 @EnumValue 和 @JsonValue
- 当SexEnum作为一个实体对象的属性时,那么该属性所映射的数据库字段就是@EnumValue作用的值
- 如果该实体对象返回到前端,那么该枚举属性对应的值就是@JsonValue修饰的字段
@Getter
@AllArgsConstructor
public enum SexEnum implements BaseEnum {
MALE(1, "男"),
FEMALE(0, "女"),
UNKNOW(2, "未知")
;
@EnumValue
private final Integer code;
@JsonValue
private final String desc;
}
方法二:实现IEnum接口
- 重写getValue等同于使用@EnumValue注解,重写toString等同于使用@JsonValue注解
@AllArgsConstructor
@Getter
//IEnum<Integer> Inteter泛型表示映射到数据库的字段类型
public enum BusinessStatusEnum implements IEnum<Integer>{
FAIL(0, "失败"),
SUCCESS(1, "成功"),
;
private final Integer code;
private final String desc;
@Override
public Integer getValue() {
return code;
}
@Override
public String toString() {
return this.desc;
}
}
- 再配置一下jackson的反序列化枚举 write_enums_using_to_string
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
serialization:
write_enums_using_to_string: true
@RequestBody中枚举不匹配问题 空字符串转枚举异常
如果前端传的值是枚举中的字符串,进入后端会转换成枚举参与运行,存入数据库时会转换成字符串对应的数字。
但如果前端传入的是"",而不是null,因找不到对应的枚举值,匹配出现异常。
/**
* 枚举字段可以使用null、空字符串、非匹配的任意字符串进行传参,而不引发异常
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void myObjectMapper() {
// 解决enum不匹配问题 默认值为false
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
}
}
其他情况
前端在调用增删改查接口的时候,传入类似 status='1',{'sex':1}之类的参数,那如何在这个接口接参(专业点说叫json反序列化)的过程中把魔法数字转换成枚举对象呢?