当前位置: 代码网 > it编程>编程语言>Java > SpringDoc基本使用的方法示例

SpringDoc基本使用的方法示例

2025年07月22日 Java 我要评论
springdoc 是基于 spring boot 的现代化 api 文档生成工具,通过自动化扫描代码和注解,生成符合 openapi 3.0+ 规范 的交互式文档,并集成 swagger ui 提供

springdoc 是基于 spring boot 的现代化 api 文档生成工具,通过自动化扫描代码和注解,生成符合 openapi 3.0+ 规范 的交互式文档,并集成 swagger ui 提供可视化测试界面。以下是其核心详解:

核心特性与优势

  • 开箱即用

    仅需添加依赖,无需复杂配置即可自动生成文档,支持 spring webmvc、webflux、spring security 及 jakarta ee。

  • 注解驱动

    使用 jsr-303 规范注解(如 @tag@operation)替代 springfox 专属注解,降低学习成本。

  • 动态兼容性

    完美适配 spring boot 2.6+ 及 3.x(含 jdk 17+),解决 springfox 因停维护导致的不兼容问题。

  • 多格式输出

    支持 json/yaml/html 格式文档,并提供分组功能,可按模块划分接口(如公开 api 与内部 api)。

集成与配置

依赖引入(spring boot 3.x)

<dependency>
    <groupid>org.springdoc</groupid>
    <artifactid>springdoc-openapi-starter-webmvc-ui</artifactid>
    <version>2.5.0</version> <!-- 官方稳定版,兼容 spring boot 3.3.x:cite[2]:cite[8] -->
</dependency>

基础配置(application.yml)

springdoc:
  swagger-ui:
    # 开启 swagger-ui 文档展示
    enabled: true
    # ui访问路径
    path: /swagger-ui.html
    # 标签排序方式
    tags-sorter: alpha
    # 操作排序方式
    operations-sorter: alpha
    # 保持认证状态
    persistauthorization: true
    # 禁用示例接口
    disable-swagger-default-url: true
  api-docs:
    # 开启 openapi 展示
    enabled: true
    # openapi json路径
    path: /v3/api-docs
  default-consumes-media-type: application/json
  default-produces-media-type: application/json
  cache:
    # 关闭文档缓存
    disabled: false
  # 显示actuator端点
  show-actuator: false
  # 推荐保持默认,显示结构化参数
  # default-flat-param-object: true
  # 允许在文档中展示 spring mvc 的 modelandview 返回类型
  model-and-view-allowed: true
  # 推荐关闭以确保文档精确性
  override-with-generic-response: false

全局信息配置类(可选)

@configuration
@openapidefinition(
  info = @info(title = "项目api文档", version = "1.0", description = "springboot接口文档")
)
public class springdocconfig { 
  // 无需额外代码
}

注解使用

常用注解

场景springdoc 注解示例
控制器描述@tag(name="模块", description="")@tag(name="用户管理", description="用户crud")
接口方法描述@operation(summary="", description="")@operation(summary="创建用户", description="需管理员权限")
参数描述@parameter(description="")@parameter(description="用户id", required=true)
模型属性描述@schema(description="")public class user { @schema(description="用户名") private string name; }l
解析对象属性为查询参数@parameterobjectpublic bizresponse getuserpage(@parameterobject userpageform form) {}

提示:

  • @hidden 可隐藏接口或参数;
  • 支持 spring security 的 @preauthorize 注解,自动在文档中标记权限需求。

控制层注解使用示例

@restcontroller
@requestmapping("/api/users")
@tag(name = "用户管理", description = "用户相关操作api")
public class usercontroller{

    @operation(summary = "获取用户信息", description = "通过用户id获取用户信息")
    @parameters({
        @parameter(in = parameterin.path, name = "id", description = "用户uid", required = true)
    })
    @apiresponse(responsecode = "404", description = "user not found")
    @getmapping("/{id}")
    public responseentity<user> getuserbyid(@pathvariable long id){
        // 实现代码
        return new responseentity(new user(10001,"feng","admin"), httpstatuscode.valueof(200));
    }
    
    @operation(summary = "获取用户列表-分页")
    @getmapping("/userpage.do")
    public bizresponse getuserpage(@parameterobject userpageform form) {
        return bizresponse.ok(userserver.getuserpage(form));
    }
    
    @operation(summary = "文件上传")
    @postmapping(name = "/upload", consumes = mediatype.multipart_form_data_value)
    public bizresponse<fileinfovo> fileupload(
            @parameter(description = "文件",
                    content = @content(mediatype = mediatype.multipart_form_data_value,
                            schema = @schema(type = "string", format = "binary")))
            @requestparam multipartfile file) {
        fileinfo fileinfo = filestorageservice.of(file).setpath(uploadfilepath).upload();
        return bizresponse.ok(fileinfo);
    }
}

模型注解使用示例

import io.swagger.v3.oas.annotations.media.schema;
import io.swagger.v3.oas.annotations.media.schema.requiredmode;
import jakarta.validation.constraints.email;
import jakarta.validation.constraints.size;

@data
public clas suser{

    @schema(description = "用户id", example = "1001")
    private integer id;

    @schema(description = "用户名", example = "john_doe", requiredmode = requiredmode.required)
    @size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
    private string username;
    
    @schema(description = "用户角色", allowablevalues = {"admin", "user", "guest"})
    private string role;

    @schema(description = "邮箱", example = "john_doe@mail.com")
    @email
    private string email;
    
    @schema(description = "最近登录时间", example = "2025-07-15 12:25:32", type = "string")
    private date lastlogintime;
    
    @schema(description = "出生年月日", example = "2025-07-15", type = "string")
    @jsonformat(pattern = "yyyy-mm-dd", timezone = "gmt+8")
    private date birthdate;
}

文件上传注解使用示例

文件上传必须声明以下配置,否则 springdoc 无法识别为文件类型,文件参数不会显示为文件上传控件

  • @postmapping 必须配置 consumes = mediatype.multipart_form_data_value
  • multipartfile 参数必须明确声明 format = "binary"

单文件上传

@postmapping(value = "/upload", consumes = mediatype.multipart_form_data_value)
@operation(summary = "上传文件")
public responseentity<string> uploadfile(
    @parameter(
        description = "文件参数",
        required = true,
        content = @content( // 关键:嵌套content注解
            mediatype = mediatype.application_octet_stream_value,
            schema = @schema(type = "string", format = "binary") // 明确格式
        )
    )
    @requestparam("file") multipartfile file) {
    // 业务逻辑
}

多文件上传(数组形式)

@parameter(
    description = "多文件上传",
    content = @content(
        mediatype = mediatype.multipart_form_data_value,
        array = @arrayschema( // 声明数组类型
            schema = @schema(type = "string", format = "binary")
        )
    )
)
@requestparam("files") multipartfile[] files

混合参数(文件+表单数据)

@requestbody(
    description = "混合参数请求",
    content = @content(
        mediatype = mediatype.multipart_form_data_value,
        encoding = {
            @encoding(name = "file", contenttype = "image/jpeg"), // 指定文件类型
            @encoding(name = "remark", contenttype = "text/plain") // 文本参数
        }
    )
)
@requestpart("file") multipartfile file,
@requestpart("remark") string remark

分组与扩展功能

分组配置

按模块隔离接口

@bean
public groupedopenapi publicapi() {
    return groupedopenapi.builder()
        .group("公开接口")
        .pathstomatch("/api/public/**")
        .build();
}

@bean
public groupedopenapi adminapi() {
    return groupedopenapi.builder()
        .group("管理接口")
        .pathstomatch("/api/admin/**")
        .addopenapimethodfilter(method -> method.isannotationpresent(preauthorize.class))
        .build();
}

访问 swagger ui 右上角切换分组

生产环境安全建议

通过配置动态关闭文档

springdoc:
  swagger-ui:
    enabled: false   # 生产环境禁用 ui
  api-docs:
    enabled: false   # 禁用 openapi 端点:cite[1]

从 springfox 迁移指南

springfox 注解springdoc 替代方案
@api@tag
@apioperation@operation(summary="", description="")
@apimodelproperty@schema(description="")
@apiparam@parameter
@apiignore@hidden

迁移优势:

  • 支持 spring boot 3.x 和 jdk 17+;
  • 注解更简洁,符合 openapi 3 规范

最佳实践与常见问题

  1. 依赖冲突

    排除旧版 swagger 依赖(如 springfox-swagger2),避免与 springdoc 冲突1。

  2. 拦截器导致文档无法访问

    若项目使用 spring security,需放行文档路径:

    http.authorizerequests().antmatchers("/swagger-ui/**", "/v3/api-docs/**").permitall();
    
  3. 文档生成失败排查

    检查控制器是否被扫描:确保 @restcontroller 位于 springdoc.packages-to-scan 指定路径下

总结

springdoc 凭借 零配置启动注解简洁深度兼容 spring 生态 的优势,已成为 spring boot api 文档的首选工具。其核心价值在于:

  • 自动化 - 减少手动维护文档的成本;
  • 标准化 - 严格遵循 openapi 3 规范;
  • 可扩展 - 分组、安全控制灵活适配复杂项目。
  • 访问 http://localhost:8080/swagger-ui.html 即可查看交互式文档(默认路径)

到此这篇关于springdoc基本使用的方法示例的文章就介绍到这了,更多相关springdoc使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com