需求场景
假设我们现在有一个项目数据要入库,项目有个字段叫项目类型,数据结构如下
{
"name" : "新项目",
"type" : 1
}
一般这个时候type就需要用枚举来存储,方便代码可读性。我们在后端建一个如下的枚举和java项目类:
public enum ProjectType{
SMALL(1, "小项目"),
NORMAL(2, "一般项目"),
BIG(3, "大项目");
private final int key;
private final String value;
//...
}
public class Project{
private String name;
private ProjectType type;
}
这样的话我们的代码可读性就比较高,如下:
public void create(Project project){
switch (project.getType){
case ProjectType.SMALL:
// ...
case ProjectType.NORMAL:
// ...
case ProjectType.BIG:
// ...
default:
// ...
}
}
这样有几个问题:
1 Project不能直接入库,Enum到数据库需要转化
2 Enum不能直接传输到前端,enum到展示需要转化
3 微服务体系中feign之间数据互传无法转化,字符串没有办法直接转enum
解决方案
问题1:
使用mybatis-plus框架,使用 @EnumValue 注解即可,mp会在入库和出库的过程中自动转化
public enum ProjectType{
SMALL(1, "小项目"),
NORMAL(2, "一般项目"),
BIG(3, "大项目");
@EnumValue
private final int key;
private final String value;
//...
}
问题2:
添加一个自定义序列化器,并且给所有的enum都实现一个公共接口BaseEnum,这个公共接口提供getKey和getValue的接口
@JsonDeserialize(using = BaseEnumDeserializer.class)
@JsonSerialize(using = BaseEnumSerializer.class)
public interface BaseEnum {
public int getKey();
public String getValue();
}
public class BaseEnumSerializer extends JsonSerializer {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
BaseEnum mapEnum = (BaseEnum) value;
Map<String,Object> map = new HashMap<>();
map.put("key", mapEnum.getKey());
map.put("value", mapEnum.getValue());
gen.writeObject(map);
}
}
这样给前端的值就会变成
{
"name" : "新项目",
"type" : {
"key": 1,
"value" : "小项目"
}
}
问题3对应反序列化器