给 User 加了个 Dept 关联,Dept 里又有 List<User>,调详情接口直接 500,日志最后是 StackOverflowError,堆栈里 toJson 反复出现。乍看像缓存或者权限的锅,追下去往往不是。
@JsonIgnore private List<User> users; // 或 @JsonBackReference private Dept dept;
追下去是这么回事:两个对象互相持有引用,序列化器按属性递归展开,没有深度上限,栈很快就耗尽。数据库的外键是单向的,内存里的对象图却成了环。
「Jackson 循环引用」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,在反向关联字段上加 @JsonIgnore 只保留一个方向;需要双向数据时用 @JsonManagedReference 和 @JsonBackReference 配对;或者返回 DTO 不直接序列化实体;改完用一条有部门的用户数据跑一次 确认响应里没有无限嵌套。
验收就看一点,详情接口返回 200 响应里 dept 只有一层 不再出现 StackOverflowError。
