REST API返回address字段无限循环,如何保留嵌套address字段且返回正确结果
问题根源
JPA双向关联属性触发Jackson序列化递归循环:Property实体持有Address关联,Address实体又反向持有Property关联,序列化时会反复嵌套两个对象,最终导致栈溢出报错。
你之前使用的@JsonIgnore、@JsonManagedReference/@JsonBackReference都是通过直接截断某一侧的序列化逻辑避免循环,因此会导致address字段无法正常输出。
可用解决方案
方案1:截断Address侧的反向序列化(最适配你的需求)
如果你不需要在返回Address数据时嵌套所属的Property信息,直接在Address类的反向关联property字段上加@JsonIgnore注解即可,修改后:
@Entity @Getter @Setter @Table(name="address") class Address{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_address") private int id_address; @Column(name = "city") private String city; @Column(name = "municipality") private String municipality; @Column(name = "place") private String place; @Column(name = "street") private String street; @Column(name = "house_number") private double house_number; @OneToOne(mappedBy = "address") @JsonIgnore // 新增该注解,序列化时忽略该反向关联字段 private Property property; }
修改后序列化Property时会完整输出address的所有字段,序列化到Address的property字段时直接跳过,不会触发循环。
方案2:使用对象唯一标识避免循环(双向序列化都需要时使用)
如果部分场景下你需要在返回Address数据时也关联输出所属的Property信息,可给两个关联实体都添加@JsonIdentityInfo注解,Jackson序列化时遇到已经输出过的对象,会直接输出其ID值而非重复嵌套整个对象:
- 给
Property类加注解:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id_property") @Entity @Data @Table(name = "property") public class Property { // 原有代码不变 }
- 给
Address类加注解:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id_address") @Entity @Getter @Setter @Table(name="address") class Address{ // 原有代码不变 }
方案3:使用DTO做返回值隔离(企业级项目最佳实践)
不直接把JPA实体类作为接口返回值,单独定义接口返回用的DTO类,只保留需要返回给前端的字段,调用接口时把实体类的属性拷贝到DTO再返回,完全避免实体类的关联关系对接口序列化的影响。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

