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

SpringDoc OpenAPI 泛型返回值完美解決方案(最新推薦)

 更新時間:2026年03月31日 09:38:17   作者:凸頭  
SpringDoc處理泛型返回類型時存在緩存和類型擦除問題,導致所有接口顯示相同的data結構,本文給大家介紹SpringDoc OpenAPI 泛型返回值完美解決方案,感興趣的朋友跟隨小編一起看看吧

?? 問題原因分析

根本原因:SpringDoc OpenAPI 在處理泛型返回類型時,@Schema 注解標注在泛型類 R<T> 上,但沒有使用 implementation 屬性指定泛型的具體類型。SpringDoc 無法在運行時自動推斷泛型參數 T 的實際類型,因此所有接口都顯示相同的 data 結構(通常是 Object 或第一次解析到的類型)。

關鍵問題點

  1. R<T> 類的 data 字段沒有指定 implementation
  2. SpringDoc 默認會將泛型 T 解析為 Object 或緩存的第一個類型

? 解決方案

需要在 Controller 方法上使用 @Operationresponses 屬性,或者使用 @ApiResponse + @Content + @Schema(implementation = ...) 顯式指定返回類型。

但更優(yōu)雅的方式是:直接在 Controller 方法上使用 @Schema 注解指定返回類型的實現類。

方案一:修改 Controller(推薦)

在每個接口方法上添加 @ApiResponse 注解顯式指定返回類型:

@Operation(summary = "查詢所有醫(yī)學系統(tǒng)")
@ApiResponse(responseCode = "200", description = "成功",
    content = @Content(schema = @Schema(implementation = R_MedicalSystemVO_List.class)))
@GetMapping("/systems")
public R<List<MedicalSystemVO>> listAllSystems() { ... }

但這種方式需要為每個泛型組合創(chuàng)建單獨的 Schema 類,比較繁瑣。

方案二:使用@Schema的oneOf屬性(不推薦)

這種方式會導致文檔結構復雜化。

方案三:最佳實踐 - 為常用泛型組合創(chuàng)建專用 Schema 類

?? 問題原因分析

根本原因

SpringDoc OpenAPI 在處理泛型返回類型 R<T> 時存在以下問題:

  1. 類型擦除:Java 泛型在運行時會被擦除,SpringDoc 無法通過反射獲取 T 的實際類型
  2. Schema 緩存:當 @Schema(name = "R") 固定時,SpringDoc 會緩存第一次解析的 Schema,導致后續(xù)所有接口都顯示相同的結構
  3. 缺少 implementation 屬性data 字段的 @Schema 沒有指定 implementation,SpringDoc 默認解析為 Object

? 解決方案總結

1. Result/R 類正確寫法

@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "統(tǒng)一接口應答封裝")  // 不要固定 name
public class R<T> implements Serializable {
    @Schema(description = "業(yè)務狀態(tài)碼", example = "0")
    private int code;
    @Schema(description = "提示信息", example = "OK")
    private String msg;
    @Schema(description = "業(yè)務數據")
    private T data;
    @Schema(description = "響應時間")
    private LocalDateTime timestamp;
    // ... 靜態(tài)方法
}

關鍵點:移除 @Schema(name = "R") 中的固定 name,避免緩存問題。

2. VO 類正確寫法

@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "MedicalSystemVO", description = "醫(yī)學系統(tǒng)視圖對象")
public class MedicalSystemVO implements Serializable {
    @Schema(description = "系統(tǒng)ID", example = "1")
    private Integer id;
    @Schema(description = "系統(tǒng)名稱", example = "神經系統(tǒng)")
    private String systemName;
    @Schema(description = "描述", example = "主要作用...")
    private String description;
}

關鍵點:每個 VO 類都需要 @Schema(name = "xxx") 指定唯一名稱。

3. Controller 正確寫法(核心)
@Operation(summary = "查詢醫(yī)學系統(tǒng)")
@ApiResponses(value = {
    @ApiResponse(responseCode = "200", description = "成功",
        content = @Content(mediaType = "application/json",
            schema = @Schema(implementation = MedicalSystemListResponse.class)))
})
@GetMapping("/systems")
public R<List<MedicalSystemVO>> listAllSystems() {
    return R.ok(systems);
}
// 為每個泛型組合創(chuàng)建響應 Schema 類
@Schema(name = "MedicalSystemListResponse", description = "醫(yī)學系統(tǒng)列表響應")
public static class MedicalSystemListResponse extends R<List<MedicalSystemVO>> {}

關鍵點

  • 使用 @ApiResponses + @Content + @Schema(implementation = ...) 顯式指定返回類型
  • 創(chuàng)建繼承 R<T> 的靜態(tài)內部類,SpringDoc 會正確解析泛型參數

4. 效果

接口Example Value
/api/medical/systems{"code":0,"msg":"OK","data":[{"id":1,"systemName":"神經系統(tǒng)"...}]}
/api/medical/systems/{id}/terms{"code":0,"msg":"OK","data":[{"id":1,"termCn":"哮喘"...}]}
/api/medical/terms/{id}{"code":0,"msg":"OK","data":{"id":1,"termCn":"哮喘","oilList":[...]}}

每個接口的 data 字段會根據 VO 類型自動生成正確的 Example Value!

?? 最佳實踐建議

  1. 推薦:將響應 Schema 類放在 Controller 內部作為靜態(tài)內部類(如代碼所示),保持代碼簡潔
  2. 或者:如果項目有多個 Controller 共用相同響應類型,可將 Schema 類提取到單獨的 response 包中
  3. 命名規(guī)范:響應 Schema 類建議命名為 XxxResponseXxxListResponse,便于區(qū)分

到此這篇關于SpringDoc OpenAPI 泛型返回值完美解決方案(最新推薦)的文章就介紹到這了,更多相關SpringDoc OpenAPI 泛型返回值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot實現跨域訪問實現代碼

    Spring Boot實現跨域訪問實現代碼

    本文通過實例代碼給大家介紹了Spring Boot實現跨域訪問的知識,然后在文中給大家介紹了spring boot 服務器端設置允許跨域訪問 的方法,感興趣的朋友一起看看吧
    2017-07-07
  • mybatis實現讀取樹結構數據實例代碼

    mybatis實現讀取樹結構數據實例代碼

    這篇文章主要介紹了mybatis實現讀取樹結構數據實例代碼的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • java1.8安裝及環(huán)境變量配置教程

    java1.8安裝及環(huán)境變量配置教程

    這篇文章主要介紹了java1.8安裝及環(huán)境變量配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 詳解Java中AbstractMap抽象類

    詳解Java中AbstractMap抽象類

    本篇文章給大家詳細介紹了Java集合中的AbstractMap抽象類的相關用法以及知識點總結,需要的朋友參考下。
    2018-03-03
  • Java8使用Function讀取文件

    Java8使用Function讀取文件

    這篇文章主要為大家詳細介紹了Java8如何使用Function讀取文件,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • IDEA 2021.1 操作SVN 最新超詳細教程(圖文)

    IDEA 2021.1 操作SVN 最新超詳細教程(圖文)

    本教程將通過idea從svn服務器中的任意一個分支檢出代碼(本文采用branches),然后再idea中創(chuàng)建新的分支、提交代碼、拉取代碼、合并分支等操作進行一一記錄,暫不包含代碼合并,對idea2021.1操作svn相關知識感興趣的朋友一起學習下吧
    2021-05-05
  • Java?C++題解leetcode817鏈表組件示例

    Java?C++題解leetcode817鏈表組件示例

    這篇文章主要為大家介紹了Java?C++題解leetcode817鏈表組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Spring中@Transactional注解的使用詳解

    Spring中@Transactional注解的使用詳解

    @Transactional注解是Spring提供的一種聲明式事務管理方式,這篇文章主要為大家詳細介紹了@Transactional注解的原理分析及使用,需要的可以參考一下
    2023-05-05
  • 淺談一下Spring中的createBean

    淺談一下Spring中的createBean

    createBean是創(chuàng)建Bean的主要方法, 該方法位于:AbstractBeanFactory的doGetBean方法中的createBean調用。本文就來淺談一下Spring中的createBean?,感興趣的可以了解一下
    2022-07-07
  • idea中Maven鏡像源詳細配置步驟記錄(對所有項目)

    idea中Maven鏡像源詳細配置步驟記錄(對所有項目)

    Maven是一個能使我們的java程序開發(fā)節(jié)省時間和精力,是開發(fā)變得相對簡單,還能使開發(fā)規(guī)范化的工具,下面這篇文章主要給大家介紹了關于idea中Maven鏡像源詳細配置(對所有項目)的相關資料,需要的朋友可以參考下
    2023-05-05

最新評論

名山县| 和林格尔县| 乐亭县| 洪雅县| 子长县| 安图县| 故城县| 武宣县| 闸北区| 司法| 潍坊市| 汽车| 邵阳县| 汾西县| 洮南市| 天柱县| 潞西市| 雷波县| 黎平县| 芒康县| 南丹县| 甘泉县| 襄城县| 连州市| 秭归县| 湘潭县| 通化市| 图片| 织金县| 比如县| 武城县| 桃园县| 额敏县| 扶绥县| 武川县| 兴山县| 伊金霍洛旗| 仙游县| 霍林郭勒市| 房山区| 睢宁县|