最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Jackson庫進行JSON?序列化時遇到了無限遞歸(Infinite?Recursion)的問題及解決方案

 更新時間:2025年03月19日 14:23:33   作者:王小工  
使用Jackson庫進行JSON序列化時遇到了無限遞歸(Infinite?Recursion)問題,這是因為兩個實體類ComPointQuotaEntity和?ComPointEntity之間存在雙向關聯(lián)point和pointQuota相互引用,本文給大家介紹解決方案,感興趣的朋友一起看看吧

使用 Jackson 庫進行 JSON 序列化時遇到了 ‌無限遞歸(Infinite Recursion)‌ 問題,這是因為兩個實體類 ComPointQuotaEntity 和 ComPointEntity 之間存在雙向關聯(lián)(point 和 pointQuota 相互引用),導致序列化時陷入死循環(huán)。以下是解決方案:

解決方案‌

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

在其中一個實體類的關聯(lián)字段上添加 @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 替代直接序列化實體

創(chuàng)建 Data Transfer Object (DTO),只暴露需要的字段,避免直接序列化 JPA 實體:

// 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;
    // 其他字段...
}

4. 配置 Jackson 忽略循環(huán)引用

在 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 {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper()
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);
    }
}

5. 自定義序列化器(高級)

為關聯(lián)字段自定義序列化邏輯,跳過循環(huán)引用:

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

‌ 總結‌

  • 推薦方案 2(@JsonManagedReference 和 @JsonBackReference)‌:簡單且能保持雙向關聯(lián)。
    ‌>- 推薦方案 3(DTO)‌:徹底解耦序列化邏輯與數(shù)據(jù)庫實體,適合復雜場景。
  • 避免直接序列化 JPA 實體,尤其是涉及雙向關聯(lián)時。

到此這篇關于Jackson庫進行JSON 序列化時遇到了 ‌無限遞歸(Infinite Recursion)的問題及解決方案的文章就介紹到這了,更多相關Jackson JSON 序列化無限遞歸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • IDEA使用Git對分支進行開發(fā)合并的全過程

    IDEA使用Git對分支進行開發(fā)合并的全過程

    本文介紹了在IDEA中使用Git進行分支開發(fā)和合并的具體操作步驟,并分享了全局用戶名和郵箱的配置命令,幫助開發(fā)者規(guī)范高效地管理項目分支,需要的朋友可以參考下
    2025-10-10
  • SpringBoot實現(xiàn)驗證碼的案例分享

    SpringBoot實現(xiàn)驗證碼的案例分享

    驗證碼可以有效防止其他人對某一個特定的注冊用戶用特定的程序,破解方式進行不斷的登錄嘗試,我們其實很經(jīng)??吹?登錄一些網(wǎng)站其實是需要驗證碼的,所以本文給大家分享了SpringBoot實現(xiàn)驗證碼的案例,需要的朋友可以參考下
    2024-11-11
  • Java class文件格式之方法_動力節(jié)點Java學院整理

    Java class文件格式之方法_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Java class文件格式之方法的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • springboot 使用yml配置文件自定義屬性的操作代碼

    springboot 使用yml配置文件自定義屬性的操作代碼

    在SpringBoot中yml/yaml文件可以自定義一些屬性,以供注入給自定義bean對象的屬性,主要通過空格和層次來實現(xiàn),類似于python代碼,本文通過實例代碼給大家介紹springboot 使用yml配置文件自定義屬性,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • java中線程的sleep()方法和yield()方法的區(qū)別

    java中線程的sleep()方法和yield()方法的區(qū)別

    本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調度器當前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下
    2024-10-10
  • SpringBoot深入講解單元測試與熱部署應用

    SpringBoot深入講解單元測試與熱部署應用

    這篇文章介紹了SpringBoot單元測試與熱部署,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • spring動態(tài)控制定時任務的實現(xiàn)

    spring動態(tài)控制定時任務的實現(xiàn)

    在實際項目中,經(jīng)常需要動態(tài)的控制定時任務,比如通過接口增加、啟動、停止、刪除定時任務,本文主要介紹了spring動態(tài)控制定時任務的實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Java中的棧概述及JVM 中的棧結構

    Java中的棧概述及JVM 中的棧結構

    棧是一種受限的線性數(shù)據(jù)結構,只能在一端(稱為 棧頂(Top))進行插入和刪除操作,本文給大家介紹Java中的棧概述深入理解JVM中的棧結構,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • jenkins如何通過pipeline部署springboot項目

    jenkins如何通過pipeline部署springboot項目

    為了提高SpringBoot項目的部署效率和規(guī)范性,建議將項目代碼和部署腳本分離,項目代碼倉庫專注業(yè)務邏輯,構建為jar包;另外設立獨立代碼倉庫存放Jenkinsfile等部署配置文件,在Jenkins中配置pipeline,自動拉取項目代碼進行構建和部署
    2024-09-09
  • 使用redisTemplate的scan方式刪除批量key問題

    使用redisTemplate的scan方式刪除批量key問題

    這篇文章主要介紹了使用redisTemplate的scan方式刪除批量key問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

仁化县| 保康县| 平泉县| 衡南县| 泰安市| 江津市| 福贡县| 丹巴县| 平泉县| 邵阳县| 中宁县| 朔州市| 邹平县| 财经| 旬阳县| 和龙市| 苍梧县| 英德市| 秦皇岛市| 河源市| 思茅市| 景东| 鸡东县| 宁德市| 韶关市| 五大连池市| 青海省| 鸡泽县| 南江县| 新郑市| 柳江县| 罗定市| 乐昌市| 昌图县| 通渭县| 灵丘县| 江安县| 固阳县| 昂仁县| 庆城县| 乳山市|