当前位置: 首页> 娱乐> 八卦 > 企业建设网站是网络营销吗_网站优化工作室_知乎推广_上海排名优化推广工具

企业建设网站是网络营销吗_网站优化工作室_知乎推广_上海排名优化推广工具

时间:2025/7/9 18:33:30来源:https://blog.csdn.net/mqiqe/article/details/146342750 浏览次数:1次
企业建设网站是网络营销吗_网站优化工作室_知乎推广_上海排名优化推广工具

使用 Jackson 库进行 JSON 序列化时遇到了 ‌无限递归(Infinite Recursion)‌ 问题,这是因为两个实体类 ComPointQuotaEntity 和 ComPointEntity 之间存在双向关联(point 和 pointQuota 相互引用),导致序列化时陷入死循环。以下是解决方案:

解决方案‌

1. 使用 @JsonIgnore 忽略一个方向的引用

在其中一个实体类的关联字段上添加 @JsonIgnore 注解,直接阻止某一方的序列化:

// ComPointQuotaEntity.java
public class ComPointQuotaEntity {@ManyToOne@JoinColumn(name = "point_id")private ComPointEntity point;  // 保留此字段的序列化// 其他字段...
}// ComPointEntity.java
public class ComPointEntity {@OneToMany(mappedBy = "point")@JsonIgnore  // 忽略此字段的序列化private List<ComPointQuotaEntity> pointQuota;// 其他字段...
}

2. 使用 @JsonManagedReference@JsonBackReference

通过注解明确父子关系,Jackson 会序列化父级(@JsonManagedReference),但忽略子级(@JsonBackReference):

// ComPointQuotaEntity.java
public class ComPointQuotaEntity {@ManyToOne@JoinColumn(name = "point_id")@JsonManagedReference  // 标记为父级(序列化)private ComPointEntity point;// 其他字段...
}// ComPointEntity.java
public class ComPointEntity {@OneToMany(mappedBy = "point")@JsonBackReference  // 标记为子级(不序列化)private List<ComPointQuotaEntity> pointQuota;// 其他字段...
}

3. 使用 DTO 替代直接序列化实体

创建 Data Transfer Object (DTO),只暴露需要的字段,避免直接序列化 JPA 实体:

public class ComPointQuotaDTO {private Long id;private ComPointDTO point;  // 避免双向引用// 其他字段...
}public class ComPointDTO {private Long id;// 不包含 pointQuota 字段// 其他字段...
}

4. 配置 Jackson 忽略循环引用

在 application.properties 或 application.yml 中配置 Jackson:

# application.properties
spring.jackson.serialization.fail-on-empty-beans=false
spring.jackson.serialization.fail-on-self-references=false

或在代码中配置 ObjectMapper:

@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {return new ObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false).configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);}
}

5. 自定义序列化器(高级)

为关联字段自定义序列化逻辑,跳过循环引用:

public class ComPointQuotaEntity {@ManyToOne@JoinColumn(name = "point_id")@JsonSerialize(using = ComPointEntitySerializer.class)private ComPointEntity point;// 其他字段...
}public class ComPointEntitySerializer extends JsonSerializer<ComPointEntity> {@Overridepublic void serialize(ComPointEntity value, JsonGenerator gen, SerializerProvider provider) throws IOException {if (value != null) {gen.writeStartObject();gen.writeNumberField("id", value.getId());// 仅序列化需要的字段,跳过 pointQuotagen.writeEndObject();}}
}

总结‌

  • 推荐方案 2(@JsonManagedReference 和 @JsonBackReference)‌:简单且能保持双向关联。
    ‌>- 推荐方案 3(DTO)‌:彻底解耦序列化逻辑与数据库实体,适合复杂场景。
  • 避免直接序列化 JPA 实体,尤其是涉及双向关联时。
关键字:企业建设网站是网络营销吗_网站优化工作室_知乎推广_上海排名优化推广工具

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: