枚举映射数据库字段

配置枚举包扫描路径

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接口

  1. 重写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;
    }

}
  1. 再配置一下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反序列化)的过程中把魔法数字转换成枚举对象呢?

参见 如何在springboot优雅的使用枚举

posted on 2022-08-11 15:37  fate_joy  阅读(3611)  评论(0编辑  收藏  举报