Spring Boot中优雅定制Jackson序列化:订单状态枚举的实战改造
在电商系统开发中,订单状态枚举的处理是个经典问题。数据库可能用数字(如2代表"已支付")存储,但API返回时需要更友好的展示(如"paid"或"已支付")。传统做法是在每个DTO字段上加@JsonSerialize注解,但这会导致大量重复代码。本文将带你从零实现一套优雅的解决方案。
1. 问题场景与基础方案
假设我们有个订单状态枚举:
java复制public enum OrderStatus {
UNPAID(1, "未支付"),
PAID(2, "已支付"),
DELIVERED(3, "已发货");
private final int code;
private final String desc;
// 构造方法、getter省略
}
直接返回给前端时,Jackson默认输出枚举名(PAID),而我们需要的是code或desc。初级方案可能是这样的:
java复制@GetMapping("/orders")
public List<OrderDTO> listOrders() {
return orderService.list().stream()
.map(o -> new OrderDTO(o.getId(),
o.getStatus().getDesc())) // 手动转换
.toList();
}
这种方案有三个明显问题:
- 业务逻辑侵入DTO:转换逻辑混在业务代码中
- 难以维护:每个接口都要重复处理
- 不一致性风险:不同接口可能返回不同格式
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 注解级解决方案
Jackson提供了@JsonSerialize和@JsonDeserialize注解,我们可以为枚举创建自定义序列化器:
java复制public class OrderStatusSerializer extends JsonSerializer<OrderStatus> {
@Override
public void serialize(Orde
