Swagger/Knife4j文档注解不更新问题的常见解决方案

 更新时间:2025年09月16日 09:34:02   作者:一勺菠萝丶  
在日常开发中,很多同学都会遇到明明改了 DTO 的 @Schema、@ApiModelProperty 注解,但打开 doc.html 或 swagger-ui 时,文档就是不更新,尤其是当 请求/响应对象用到了内部类(nested static class) 时,所以本文就把常见原因和解决方案总结出来,需要的朋友可以参考下

在日常开发中,很多同学都会遇到这样的问题:

明明改了 DTO 的 @Schema@ApiModelProperty 注解,但打开 doc.htmlswagger-ui 时,文档就是不更新!

尤其是当 请求/响应对象用到了内部类(nested static class) 时,这个问题更常见。本文就把常见原因和解决方案总结出来,帮大家彻底避坑。

1、问题原因

内部类(Nested Static Class)的缓存机制

  • Swagger/Knife4j 对内部类会生成类似 OuterClass$InnerClass 的 schema 名称。
  • 这部分有缓存机制,注解改了但类文件没被替换时,Swagger 仍然会使用旧的缓存。

Springdoc/Knife4j 的缓存

  • 为了性能,Springdoc/Knife4j 默认会缓存模型(Schema)信息。
  • 这就导致改了注解,重启服务后文档有时也不更新。

编译产物未刷新

  • IDE(如 IDEA)在二次启动时可能不会重新编译内部类,导致 OuterClass$InnerClass.class 没有更新,Swagger 读到的还是旧字节码。

2、解决方案

方案一:拆分内部类

把内部类单独抽出来,定义为独立的 DTO 类。

@Data
@Schema(description = "采购入库保存请求")
public class ErpPurchaseInSaveReqVO {

    @Schema(description = "保存项列表")
    private List<ErpPurchaseInSaveItemReqVO> items;
}

@Data
@Schema(description = "采购入库保存项")
public class ErpPurchaseInSaveItemReqVO {
    @Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED)
    private Long productId;
}

这是最推荐的方式,Swagger/Knife4j 的解析最稳定。

方案二:保留内部类,但加上唯一的 @Schema(name)

如果确实想用内部类,可以这样:

@Data
@Schema(description = "采购入库保存请求")
public class ErpPurchaseInSaveReqVO {

    @Data
    @Schema(name = "ErpPurchaseInSaveItemReqVO", description = "采购入库保存项")
    public static class Item {
        @Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED)
        private Long productId;
    }
}

注意:

  • name 必须唯一,否则多个内部类会冲突。
  • 配合 clean 编译 效果更佳。

方案三:禁用 Springdoc 缓存

application-dev.yml 里加上:

springdoc:
  api-docs:
    enabled: true
    path: /v3/api-docs
  swagger-ui:
    enabled: true
    path: /swagger-ui
  default-flat-param-object: true
  cache:
    disabled: true # 禁用缓存,每次启动重新生成文档

这样每次启动服务时,都会强制重新扫描类并生成文档。

推荐在 开发环境 打开,生产环境保持默认缓存以节省性能。

方案四:确保编译产物更新

  • 每次改注解后执行 mvn clean compile,保证 .class 文件更新。
  • 或在 IDEA 中执行 Build → Rebuild Project
  • 访问 doc.html 时,使用 Ctrl+F5 强制刷新浏览器缓存。

3、总结推荐

  • 开发阶段:建议用 方案二 + 方案三(内部类加 @Schema(name) + 禁用缓存),这样改注解后重启服务就能生效。
  • 长期维护:推荐 方案一,把内部类抽成独立 DTO 类,Swagger/Knife4j 解析最稳定,后续协作成本更低。

一句话总结

Swagger/Knife4j 文档不更新,大多数情况下是 内部类缓存 + 文档缓存 + 编译不刷新 三者叠加的锅。
禁用缓存 + 唯一命名 + clean 编译,基本能解决 90% 的问题。

到此这篇关于Swagger/Knife4j文档注解不更新问题的常见解决方案的文章就介绍到这了,更多相关Swagger/Knife4j文档注解不更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java轻松实现权限认证管理的示例代码

    Java轻松实现权限认证管理的示例代码

    我们在实际开发中经常会进行权限认证管理,给不同的人加上对应的角色和权限,本文将实现一个简易的权限验证管理系统,感兴趣的小伙伴可以了解下
    2023-12-12
  • SpringBoot如何优雅的处理校验参数的方法

    SpringBoot如何优雅的处理校验参数的方法

    这篇文章主要介绍了SpringBoot如何优雅的处理校验参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java多线程的原子性,可见性,有序性你都了解吗

    Java多线程的原子性,可见性,有序性你都了解吗

    这篇文章主要为大家详细介绍了Java多线程的原子性,可见性,有序性,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java模拟实现ATM机

    Java模拟实现ATM机

    这篇文章主要为大家详细介绍了Java模拟实现ATM机,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Java创建表格实例详解

    Java创建表格实例详解

    这篇文章主要介绍了Java创建表格实例详解,需要的朋友可以参考下。
    2017-09-09
  • Java使用同步方法解决银行取钱的安全问题案例分析

    Java使用同步方法解决银行取钱的安全问题案例分析

    这篇文章主要介绍了Java使用同步方法解决银行取钱的安全问题,结合具体案例形式分析了java同步方法实现多线程安全操作银行取钱问题,需要的朋友可以参考下
    2019-09-09
  • Java实现md5和base64加密解密的示例代码

    Java实现md5和base64加密解密的示例代码

    这篇文章主要介绍了Java实现md5和base64加密解密的示例代码,帮助大家更好的利用Java加密解密文件,感兴趣的朋友可以了解下
    2020-09-09
  • 在Windows系统下安装Thrift的方法与使用讲解

    在Windows系统下安装Thrift的方法与使用讲解

    今天小编就为大家分享一篇关于在Windows系统下安装Thrift的方法与使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    这篇文章主要介绍了Spring Cloud 整合Apache-SkyWalking链路跟踪的示例代码,代码简单易懂,通过图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot如何上传图片

    SpringBoot如何上传图片

    这篇文章主要介绍了SpringBoot如何上传图片,帮助大家更好的理解和学习springboot框架,感兴趣的朋友可以了解下
    2020-09-09

最新评论