enum从数据库到java,从java到前端的序列化反序列化指南

需求场景

假设我们现在有一个项目数据要入库,项目有个字段叫项目类型,数据结构如下

{
	"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对应反序列化器

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值