mybatis_plus 使用通用枚举

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;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值