对的,你的理解完全正确。
@EnumValue 和 @JsonValue 同时标在 code 上,意思就是:
- 存数据库时 :MyBatis-Plus 用
code的值(比如1) - 返回前端时 :Jackson 用
code的值(比如1)
一个存数据库,另一个返回前端
很简单,把两个注解分开标在不同字段上就行。
比如数据库存数字 code,但前端想看中文 desc:
java
@Getter
@AllArgsConstructor
public enum OrderStatus {
PENDING(1, "待支付"),
PAID(2, "已支付");
@EnumValue
private final int code; // 存数据库用这个
@JsonValue
private final String desc; // 返回前端用这个
// 反序列化:前端传 "待支付" 时转回枚举
@JsonCreator
public static OrderStatus fromDesc(String desc) {
for (OrderStatus s : values()) {
if (s.desc.equals(desc)) {
return s;
}
}
throw new IllegalArgumentException("无效状态: " + desc);
}
}
效果:
json
// 返回给前端
{ "status": "待支付" }
// 数据库里
status = 1
反过来也行
数据库存中文,前端拿数字:
java
@EnumValue
private final String desc; // 数据库存 "待支付"
@JsonValue
private final int code; // 前端拿 1
不过这种一般不推荐,数据库存字符串浪费空间。
怎么选
| 场景 | 写法 |
|---|---|
数据库和前端都用 code |
两个注解都标 code(最常见) |
数据库存 code,前端看 desc |
@EnumValue 标 code,@JsonValue 标 desc |
数据库存 desc,前端拿 code |
@EnumValue 标 desc,@JsonValue 标 code |
一句话记
注解标在哪个字段上,那个字段就负责对应的"出口"。两个注解可以标同一个字段,也可以分开标。
实际项目里 90% 的情况都是两个注解标同一个 code,数据库和前端统一用数字,最省事。
要不要说说 @JsonCreator 和 @EnumValue 方向不一致时(一个用 code、一个用 desc),实际项目里一般怎么取舍?