You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电商API订单保存商品列表失败,出现无限递归栈溢出错误

解决电商API订单保存与JSON序列化无限递归问题

问题诊断

当前遇到两个核心问题:

  1. JSON序列化无限递归:Order包含OrderProduct列表,OrderProduct又持有Order引用,Jackson序列化时会循环遍历双方关联,最终触发StackOverflowError。
  2. 双向关联维护缺失:创建OrderProduct时仅单向设置了order属性,未同步维护Order侧的关联关系,可能导致订单商品列表无法持久化到数据库。

修复步骤

1. 打破JSON循环引用

在实体类的双向关联字段上添加Jackson注解,中断序列化循环:

修改Order实体

@Entity
@Table(name = "orders")
public class Order {
    // 其他字段保持不变

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference // 标记主动引用,序列化时会正常输出列表
    private List<OrderProduct> products = new ArrayList<>();

    // 构造方法及其他方法不变
}

修改OrderProduct实体

@Entity
@Table(name = "order_products")
public class OrderProduct implements Serializable {
    // 其他字段保持不变

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    @JsonBackReference // 标记被动引用,序列化时会被忽略
    private Order order;

    // 构造方法及其他方法不变
}

2. 正确维护JPA双向关联

在Order类中添加辅助方法,确保双向关联的同步性,同时通过cascade属性实现订单保存时级联保存商品关联:

给Order类添加关联维护方法

public void addOrderProduct(OrderProduct orderProduct) {
    this.products.add(orderProduct);
    orderProduct.setOrder(this);
}

修改服务层的商品列表构建逻辑

private List<OrderProduct> getOrderProducts(Order order, Map<Long, Integer> productsObj) {
    List<OrderProduct> products = new ArrayList<>();
    for (Map.Entry<Long, Integer> entry : productsObj.entrySet()) {
        Product product = productService.updateProductStock(entry.getKey(), entry.getValue(), true);
        OrderProduct orderProduct = new OrderProduct(order, product, entry.getValue());
        order.addOrderProduct(orderProduct); // 调用辅助方法同步双向关联
        products.add(orderProduct);
    }
    return products;
}

3. 验证持久化逻辑

由于@OneToMany注解添加了cascade = CascadeType.ALL,调用orderRepository.save(order)时会自动级联保存所有关联的OrderProduct实例,无需单独保存商品关联对象。

额外建议

  • 避免直接返回JPA实体给前端,建议定义专门的响应DTO(如OrderResponseDTO),只包含前端需要的字段,从根源避免序列化问题。
  • 检查Product实体是否存在类似双向关联,若有需同样处理Jackson注解。

内容的提问来源于stack exchange,提问作者Pedro Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:43:17