优雅地实现java枚举与int值地转换(Spring表单提交、Jackson、Mybatis、dubbo)

该博客旨在优雅地解决Java枚举与int值之间的转换问题,遵循阿里巴巴开发规范。通过创建特定接口并让枚举实现,配合Jackson、Spring表单提交、Mybatis及dubbo的适配,实现在多种场景下的自动转换,避免手动处理,提升开发效率。
摘要由CSDN通过智能技术生成

阿里巴巴的开发规范里有这么一条:

5.【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值里不允许使用枚举类型或者包含枚举类型的POJO对象。

网上很多人将此粗暴的理解为不让用枚举,这是错误的。
这个规范只是不让在接口返回值中使用枚举,因为会存在潜在的序列化问题。但是在其他地方是可以使用枚举的,毕竟大家都用int的话,维护起来简直就是地狱。

0、目标

假如我有一个POJO类,里面有一个Color枚举:

public class Fruit{
   
    public Long id;
    public Color color;
}

@Getter
@AllArgsConstructor
public enum Color extends ConvertibleEnum{
   
    RED(0,"red"),
    GREEN(0,"green");
    private final value;
    private final description;
}

我们的目标就是像上面的代码一样,代码中无需做任何的处理(仅仅让枚举类继承一个接口),在接收前端数据、将数据返回给前端、将数据存储到数据库中时,我的Color枚举都可以自动和int转换,这样既方便我们的开发,又不违反阿里巴巴的开发规范

一、创建接口

只要创建如下的接口,然后让自己的枚举类实现这个接口即可

public interface ConvertibleEnum{
   
    Integer getValue();
}

二、适配Jackson

Jackson的处理比较简单,直接在枚举中加上@JsonValue注解即可

import com.fasterxml.jackson.annotation.JsonValue;

@Getter//这个是lombok的注解,可以生成getter,或者自己加上getter
@AllArgsConstructor
public enum MyStatus implements ConvertibleEnum{
   //记得实现第一步中定义的接口
    CREATE(1,"已创建"),
    DELETED(1,"已删除");
    @JsonValue//加上这个注解即可,对于枚举类型,jackson在序列化和反序列化的时候都会使用这个值作为转换的依据
    private final Integer value;
    private final String title;
}

三、适配Spring的表单提交

3.1 创建converter factory
public class SpringFormEnumConverterFactory implements ConverterFactory<String, ConvertibleEnum> {
   
    @Override
    public <T extends 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值