在目前项目开发过程中,一个实体可能有四五种状态,那么列举这些状态就可以枚举来进行定义,避免后期混乱,但是在实际开发中,会有以下几个担心:
1.我在请求参数中定义了枚举,前端怎么传,毕竟前端又没有对应的数据类型
2.我在实体类中用了枚举,怎么存到数据库中,毕竟数据库又没有枚举类型
所以以上两个担心一直让我以一个很蠢的方式在用枚举,但是最近偶然发现我的担忧其实早就有解决方法了。
以下举例
定义一个枚举类:重点在于@JsonFormat(shape = JsonFormat.Shape.OBJECT)、@JsonCreator 、 @EnumValue,这三个地方可以说完美解决了我上面的问题。
@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT) // 让响应以对象形式展示 {code, desc}
public enum OrderStatus {
PROCESSING(1, "处理中"),
COMPLETED(2, "已完成"),
CANCELED(3, "已取消");
@EnumValue
private final int code;
private final String desc;
@JsonCreator // 支持前端传 code 时自动反序列化
public static OrderStatus fromCode(int code) {
for (OrderStatus status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("无效的状态码: " + code);
}
}
请求参数:这里就可以大胆使用枚举来作为请求参数了,因为前端传数字,会自动映射为枚举类型
import lombok.Data;
@Data
public class OrderQueryParam {
private Long orderId;
private OrderStatus status;
}
实体中:这里就可以直接把枚举映射到数据库对应的字段了,数据库存储的是枚举的code。但要注意的是,这里只有在Mybatis-plus环境下才可以使用
@TableField("status")
private OrderStatus status;
总结:
需求 | 实现方式 |
---|---|
前端传 code 而不是 name | 用 @JsonCreator 配合自定义构造方法 |
返回响应包含 code + desc | 用 @JsonFormat(shape = OBJECT) |
数据库存储用 @EnumValue | 只影响 MyBatis-Plus,和前端无关 |
统一枚举结构 | 建议所有枚举实现统一接口,如 BaseEnum |