枚举在实际开发中的使用小Tips

在目前项目开发过程中,一个实体可能有四五种状态,那么列举这些状态就可以枚举来进行定义,避免后期混乱,但是在实际开发中,会有以下几个担心:

1.我在请求参数中定义了枚举,前端怎么传,毕竟前端又没有对应的数据类型

2.我在实体类中用了枚举,怎么存到数据库中,毕竟数据库又没有枚举类型

所以以上两个担心一直让我以一个很蠢的方式在用枚举,但是最近偶然发现我的担忧其实早就有解决方法了。

以下举例

定义一个枚举类:重点在于@JsonFormat(shape = JsonFormat.Shape.OBJECT)、@JsonCreator 、 @EnumValue,这三个地方可以说完美解决了我上面的问题。

less 复制代码
@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);
    }
}

请求参数:这里就可以大胆使用枚举来作为请求参数了,因为前端传数字,会自动映射为枚举类型

kotlin 复制代码
import lombok.Data;
​
@Data
public class OrderQueryParam {
    private Long orderId;
    private OrderStatus status;
}
​

实体中:这里就可以直接把枚举映射到数据库对应的字段了,数据库存储的是枚举的code。但要注意的是,这里只有在Mybatis-plus环境下才可以使用

kotlin 复制代码
@TableField("status")
private OrderStatus status;
​

总结:

需求 实现方式
前端传 code 而不是 name @JsonCreator 配合自定义构造方法
返回响应包含 code + desc @JsonFormat(shape = OBJECT)
数据库存储用 @EnumValue 只影响 MyBatis-Plus,和前端无关
统一枚举结构 建议所有枚举实现统一接口,如 BaseEnum
相关推荐
拖孩20 分钟前
一个人 + AI 做的小程序,一个月赚了 36 块
前端·后端·微信小程序
程序员cxuan1 小时前
为啥 Blender 突然火了?
人工智能·后端·程序员
IT_陈寒1 小时前
React的状态更新竟然不是同步的?!坑了我一整天
前端·人工智能·后端
必须会一定会1 小时前
Spring Boot 3 + PostgreSQL 场景工程持久化:revision、contentHash 与历史回滚
人工智能·spring boot·后端·postgresql·ai编程
object not found1 小时前
Nuxt4去掉body中默认的边距
开发语言·后端·rust
zzzll11113 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
vx-Biye_Design8 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
2分钟速写快排10 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
面向Google编程10 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
jason成都11 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring