阿里巴巴的开发规范里有这么一条:
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