1. 问题引出
当实体类的状态属性为Integer类型时,容易写错
2. 初步修改
把状态属性强制为某个类型,并且自定义一些可供选择的常量。
public class LessonStatus {
public static final LessonStatus NOT_LEARNED = new LessonStatus(0,"未学习");
public static final LessonStatus LEARNING = new LessonStatus(1,"学习中");
public static final LessonStatus FINISHED = new LessonStatus(2,"已学完");
public static final LessonStatus INVALID = new LessonStatus(3,"已失效");
private int value;
private String desc;
private LessonStatus(int value, String desc){
this.value=value;
this.desc=desc;
}
}
在java1.4过后,可以用enum类型代替以上写法
public enum LessonStatus {
NOT_LEARNED(0,"未学习"),
LEARNING(1,"学习中"),
FINISHED(2,"已学完"),
INVALID(3,"已失效");
private int value;
private String desc;
LessonStatus(int value,String desc){
this.value = value;
this.desc = desc;
}
}
使用该类型
3. @EnumValue
但是这样做,将数据插入表时会产生类型不匹配的问题。实体类为enum类型,表的列属性为tinyint类型。
因此,给需要注入值的字段加上@EnumValue注解,表示插入数据库时,实际上插入的是该字段而不是整个枚举对象。
再次测试,成功
4. 使用案例
@JsonValue:与@EnumValue相似,转换成json对象时,只序列化该注解下的字段
@JsonCreator:json反序列化,将该字段转换成一个object对象
@Getter
public enum LessonStatus implements BaseEnum {
NOT_BEGIN(0, "未学习"),
LEARNING(1, "学习中"),
FINISHED(2, "已学完"),
EXPIRED(3, "已过期"),
;
@JsonValue
@EnumValue
int value;
String desc;
LessonStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static LessonStatus of(Integer value){
if (value == null) {
return null;
}
for (LessonStatus status : values()) {
if (status.equalsValue(value)) {
return status;
}
}
return null;
}
}
@Getter
public enum PlanStatus implements BaseEnum {
NO_PLAN(0, "没有计划"),
PLAN_RUNNING(1, "计划进行中"),
;
@JsonValue
@EnumValue
int value;
String desc;
PlanStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static PlanStatus of(Integer value){
if (value == null) {
return null;
}
for (PlanStatus status : values()) {
if (status.equalsValue(value)) {
return status;
}
}
return null;
}
}
json序列化见下一篇博客@JsonValue和@JsonCreator使用。