前言
仅记录学习笔记,如有错误欢迎指正。
这段时间做新项目(Springboot+mybatisPlus),很多实体类的属性用的枚举,而我们的项目的枚举类型都是:male(1,"男")
对应Enum.name(code,name),
项目需求:
保存时:<前台传code,我们需要用枚举类型去接受,然后保存code到数据库。
查询时:在查询出数据库的code时,需要映射到枚举中,然后返回枚举给前台(code+name)
解决方案
先从数据库返回数据用枚举接收来看:@JsonFormat(shape = JsonFormat.Shape.OBJECT)
这个注解的作用是,当你从数据库已经读取到数据了,他会帮你返会一个枚举对象给前台!
由于数据库是根据Enum.name来映射保存到枚举对象的,而我们保存的是code到数据库,若是Ename和code一致,则没有问题,可以直接返回枚举对象,可若是不一致,则数据会无法映射到枚举上,这时可以自定义一个枚举接口IEnum(见代码)
定义一个获取枚举的方法,注意实现接口的时候这里需要return的是你数据保存的值!!这样的话,当数据返回的时候,会根据你数据库保存的值来映射队形的枚举对象,然后通过这个注解返回对象给前台!
再来看看前台传code,怎么用枚举来接受:
这个可以通过反射获取前台传过来的code值,然后根据code找到对应的枚举值,返回枚举对象。
这里推荐一个博客:传送
这个的反射方法亲测可行;后面只需要按照他说的在对应的枚举上加上@JsonDeserialize(using = JsonEnumDeserializer.class)就ok啦~
假如你们的前端在插入数据的时候传的不是code而是name,返回的数据也不需要枚举对应的code,只需要显示的name。
这里你可以用 @EnumValue 和 @JsonValue 这两个注解,它们可以使前台传来的name变为code插入到数据库,查询出的code变为name返回给前端!!
使用方式也很简单,在保存的数据的字段上加@EnumValue
在前端需要显示字段上加 @JsonValue
可以参考下面的TestEnum
代码
IEnum:public interface IEnum <T extends Serializable>{
/**
* 枚举数据在数据库中的存储值
*/
T getValue();
}
示例: public enum TestEnum implements IEnum{
male ("1","男"),
;
@EnumValue
private final String code;
@JsonValue
private final String name;
TestEnum(String code,String name){
this.code = code;
this.name = name;
}
public String getCode(){
return this.code;
}
public String getName(){
return this.name;
}
@Override
public Serializable getValue() {
return this.code;
}
}