如何使用Jackson序列化/反序列化物料清单(BOM)的关联方实体
问题根因
你当前遇到的问题是两个注解的特性冲突导致的:
@JsonBackReference的原生作用就是标记该字段在序列化时直接跳过,所以你配置了该注解的firstParty、secondParty字段不会出现在序列化结果中- 去掉该组注解后,序列化逻辑会进入无限循环:Party对象序列化关联的
PartyRelationship集合 ->PartyRelationship序列化关联的Party对象 -> 新的Party对象又会序列化它自己的关联关系集合,最终触发StackOverflowError
解决方案
最适配你「仅序列化一级层级」需求的方案是用@JsonIgnoreProperties注解切断二级递归,无需自定义序列化逻辑,修改步骤如下:
- 删除
Party类中两个字段上的@JsonManagedReference注解 - 删除
PartyRelationship类中两个字段上的@JsonBackReference注解 - 给
PartyRelationship类的firstParty、secondParty字段添加@JsonIgnoreProperties,忽略Party对象里的关联关系集合字段,避免递归序列化
修改后的PartyRelationship类对应字段配置如下:
@ManyToOne(optional = false) @JoinColumn(name = "first_party_id", referencedColumnName = "party_id") @JsonProperty("firstParty") @JsonIgnoreProperties({"firstParties", "secondParties"}) // 忽略关联关系字段,切断递归 private PartyDO firstParty; @ManyToOne(optional = false) @JoinColumn(name = "second_party_id", referencedColumnName = "party_id") @JsonProperty("secondParty") @JsonIgnoreProperties({"firstParties", "secondParties"}) // 忽略关联关系字段,切断递归 private PartyDO secondParty;
注意事项
你的关联关系配置的是FetchType.LAZY懒加载,序列化前需要确保关联的Party对象已经被加载:
- 可以将关联字段的
fetch属性改为FetchType.EAGER - 或者在查询Party对象的DAO层逻辑中,使用
join fetch语句主动加载关联的firstParty、secondParty字段,避免懒加载异常
内容的提问来源于stack exchange,提问作者suitej
相关产品推荐
相关产品推荐

