Swagger 在 Spring Boot 中的详细使用指南

Swagger 是一个强大的 API 文档生成工具,在 Spring Boot 项目中主要通过 springdoc-openapi 库实现。下面我将详细讲解 Swagger 的配置、注解使用和高级功能。

一、基础配置

1. 添加依赖

在 pom.xml 中添加:

xml

复制

下载

运行

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version> <!-- 检查最新版本 -->
</dependency>

2. 基础配置(application.properties)

properties

复制

下载

# 启用 Swagger
springdoc.api-docs.enabled=true# 文档基本信息配置
springdoc.swagger-ui.path=/swagger-ui.html
springdoc.api-docs.path=/v3/api-docs
springdoc.info.title=订单管理系统 API
springdoc.info.description=订单管理系统的 RESTful API 文档
springdoc.info.version=1.0.0
springdoc.info.contact.name=技术支持
springdoc.info.contact.email=support@example.com
springdoc.info.license.name=Apache 2.0
springdoc.info.license.url=https://www.apache.org/licenses/LICENSE-2.0

二、核心注解使用

1. Controller 层注解

java

复制

下载

@RestController
@RequestMapping("/api/orders")
@Tag(name = "订单管理", description = "订单的创建、查询和管理操作")
public class OrderController {@Operation(summary = "创建新订单",description = "创建一个新的订单记录",responses = {@ApiResponse(responseCode = "201", description = "订单创建成功"),@ApiResponse(responseCode = "400", description = "无效的输入")})@PostMappingpublic ResponseEntity<Order> createOrder(@RequestBody @Valid @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "订单对象",required = true,content = @Content(schema = @Schema(implementation = Order.class))Order order) {// 实现逻辑}@Operation(summary = "根据ID获取订单",description = "通过订单ID获取订单详细信息")@GetMapping("/{id}")public Order getOrderById(@Parameter(name = "id",description = "订单ID",required = true,example = "12345")@PathVariable Long id) {// 实现逻辑}@Operation(summary = "分页查询订单",description = "根据条件分页查询订单列表")@GetMappingpublic Page<Order> getOrders(@Parameter(description = "页码,从0开始", example = "0") @RequestParam(defaultValue = "0") int page,@Parameter(description = "每页记录数", example = "10") @RequestParam(defaultValue = "10") int size,@Parameter(description = "排序字段,格式: field[,asc|desc]") @RequestParam(required = false) String sort) {// 实现逻辑}
}

2. 模型类注解

java

复制

下载

@Schema(description = "订单实体")
public class Order {@Schema(description = "订单ID", example = "1001")private Long id;@Schema(description = "订单状态", allowableValues = {"CREATED", "PAID", "SHIPPED", "COMPLETED", "CANCELLED"},example = "CREATED")private String status;@Schema(description = "订单总金额", example = "199.99")private BigDecimal totalAmount;@Schema(description = "创建时间", example = "2023-10-01T12:00:00Z")private LocalDateTime createdAt;// Getter/Setter
}

3. 枚举类型注解

java

复制

下载

@Schema(description = "订单状态枚举")
public enum OrderStatus {@Schema(description = "已创建")CREATED,@Schema(description = "已支付")PAID,@Schema(description = "已发货")SHIPPED,@Schema(description = "已完成")COMPLETED,@Schema(description = "已取消")CANCELLED
}

三、高级配置

1. 自定义全局配置类

java

复制

下载

@Configuration
public class SwaggerConfig {@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("订单管理系统 API").version("1.0.0").description("订单管理系统的 RESTful API 文档").contact(new Contact().name("技术支持").email("support@example.com")).license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0"))).externalDocs(new ExternalDocumentation().description("项目 Wiki 文档").url("https://wiki.example.com")).addSecurityItem(new SecurityRequirement().addList("bearerAuth")).components(new Components().addSecuritySchemes("bearerAuth", new SecurityScheme().name("bearerAuth").type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")));}
}

2. 分组配置

java

复制

下载

@Bean
public GroupedOpenApi adminApi() {return GroupedOpenApi.builder().group("admin").pathsToMatch("/api/admin/**").build();
}@Bean
public GroupedOpenApi publicApi() {return GroupedOpenApi.builder().group("public").pathsToMatch("/api/public/**").build();
}

3. 安全配置(JWT 示例)

java

复制

下载

@Operation(summary = "获取用户信息", security = {@SecurityRequirement(name = "bearerAuth")})
@GetMapping("/me")
public User getCurrentUser() {// 实现逻辑
}

四、常用注解详解

注解作用域描述
@TagController标记控制器,用于分组和描述
@Operation方法描述 API 操作(GET/POST/PUT/DELETE 等)
@Parameter参数描述方法参数(路径参数、查询参数等)
@RequestBody参数描述请求体内容
@ApiResponse方法描述操作的可能响应
@Schema模型类/属性描述数据模型及其属性
@Hidden类/方法/属性从文档中隐藏指定的元素
@SecurityRequirement方法声明操作所需的安全方案

五、Swagger UI 高级功能

1. 自定义 UI 配置

properties

复制

下载

# 自定义 UI 路径
springdoc.swagger-ui.path=/custom-swagger# 禁用 Try It Out 功能
springdoc.swagger-ui.supportedSubmitMethods=# 默认展开深度
springdoc.swagger-ui.docExpansion=none# 自定义主题
springdoc.swagger-ui.configUrl=/swagger-config

2. 添加全局请求头

java

复制

下载

@Bean
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream()).forEach(operation -> {operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myGlobalHeader"));});
}

六、生产环境注意事项

1. 禁用 Swagger UI

properties

复制

下载

# 生产环境禁用 Swagger UI
springdoc.swagger-ui.enabled=false
springdoc.api-docs.enabled=false

2. 条件启用配置

java

复制

下载

@Profile({"dev", "test"})
@Configuration
public class SwaggerConfig {// 只在 dev/test 环境启用
}

3. 安全保护

java

复制

下载

@Bean
public OpenApiCustomiser securityOpenApiCustomiser() {return openApi -> openApi.getPaths().values().forEach(pathItem ->pathItem.readOperations().forEach(operation -> {operation.setSecurity(Collections.singletonList(new SecurityRequirement().addList("basicAuth")));}));
}

七、最佳实践

  1. 保持文档同步:将 Swagger 注解作为代码的一部分维护

  2. 使用分组:大型项目按模块分组展示 API

  3. 提供完整示例:为每个模型属性添加 example 值

  4. 描述错误响应:详细描述可能的错误响应码和内容

  5. 结合测试:使用 Swagger 生成测试用例,确保文档准确性

  6. 版本控制:API 版本变更时同步更新文档版本

八、访问文档

启动应用后访问:

  • Swagger UI 界面http://localhost:8080/swagger-ui.html

  • OpenAPI JSONhttp://localhost:8080/v3/api-docs

九、常见问题解决

  1. 404 错误

    • 检查依赖是否正确添加

    • 确认 springdoc.api-docs.enabled=true

  2. 注解不生效

    • 检查包扫描范围

    • 确保使用正确的注解(io.swagger.v3.oas.annotations

  3. 模型属性未显示

    • 确保有公共 getter 方法

    • 或使用 @Schema 显式标注

  4. 日期格式问题

    java

    复制

    下载

    @Schema(type = "string", format = "date-time")
    private LocalDateTime createTime;

通过以上详细配置和注解使用,你可以为 Spring Boot 项目生成专业、易用的 API 文档,大大提高开发效率和协作质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86219.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群晖如何开启及使用ssh:小白用户上手指南-家庭云计算专家

最近很多用户希望提供群晖下onlyoffice的安装服务,但是很多都是萌新小白,不知道怎么启用ssh和使用ssh客户端.这里提供简单的方法,统一答复: 重要的事情说3遍:一定不要自己发挥,全部按说明的来;一定要在内网环境用内网ip访问;不要用域名和端口号,谢谢各位萌新了!!! 一、ssh启用…

Ubuntu查看与切换显示管理器(已测试ubuntu20,ubuntu24)

一级标题 显示管理器是用户使用图形化的登录界面。 当用户成功输入用户名和密码后&#xff0c;即可开始使用图形化界面会话。gdm3和 lightdm 都是显示管理器。 它们提供了图形化登录并处理用户身份验证。 查看正在使用的显示管理器&#xff1a; cat /etc/X11/default-displa…

ROS 2 中 Astra Pro 相机与 YOLOv5 检测功能编译启动全记录

先记录大概主要流程&#xff0c;后期有时间了再完善细节以及附上截图 一、编译 Astra Pro 相机功能包 1. 清理并编译相机包 cd ~/Astra_ws rm -rf build/astra_camera install/astra_camera # 清理旧编译 colcon build --packages-select astra_camera --parallel-workers …

当实体类名和数据库表列名不一致时不能封装数据的解决办法

1. <resultMap> 是什么&#xff1f; 作用&#xff1a;<resultMap> 用来定义数据库表字段和Java实体类属性之间的对应关系。 为什么需要&#xff1f; 数据库字段通常用下划线命名&#xff08;如 brand_name&#xff09;&#xff0c;而Java类属性用驼峰命名&#…

window系统上labelImg的安装与使用

一、window上安装Anaconda 下载&#xff1a;https://repo.anaconda.com/archive/选择版本&#xff0c;此次选择的是Anaconda3-2025.06-0-Windows-x86_64.exe双击安装在 Windows 搜索栏中输入 Anaconda Prompt 并打开。 二、安装pyton3.8 wondow环境 在 Windows 搜索栏中输入…

SSE 流与普通 HTTP 响应的区别

1. 连接特性 特性普通 HTTP 响应SSE 流连接持续时间一次性&#xff0c;请求-响应后立即关闭持久连接&#xff0c;保持打开状态通信方向单向 (客户端→服务器→客户端)单向 (服务器→客户端)数据格式完整响应体流式文本数据 (text/event-stream) 2. 数据传输方式 普通 HTTP 响…

Proteus仿真51单片机控制L298N PWM电机调速

51单片机概述 51单片机是指Intel公司开发的MCS-51系列单片机及其兼容产品&#xff0c;是应用最广泛的8位单片机系列之一。其名称来源于该系列的第一款芯片8051。 主要特点&#xff1a; 8位CPU&#xff1a;处理数据宽度为8位 哈佛结构&#xff1a;程序存储器和数据存储器分开…

批量将exb文件转为pdf的实用工具

最近在工作中遇到了一个棘手的问题&#xff1a;需要将大量CAXA电子图板(.exb)格式的图纸文件转换为PDF格式以便于共享和查阅。手动一个个打开转换不仅效率低下&#xff0c;而且容易出错。于是&#xff0c;我决定开发一个批量转换工具来解决这个问题。 使用效果 在实际使用中&…

从C++编程入手设计模式——命令模式

从C编程入手设计模式——命令模式 ​ 命令模式是一个用指令封装请求的优雅方法。换而言之&#xff0c;对于一个复杂的系统&#xff0c;当我们发现&#xff0c;使用一系列的指令&#xff08;Command&#xff09;来操作对象的时候&#xff0c;这个设计模式就会显得非常的实用。我…

【基础篇-消息队列】——如何通过网络传输结构化的数据( 序列化与反序列化)

目录 一、引入前提二、选择哪种序列化实现2.1、选择哪种序列化实现需要权衡的几个因素2.2、如何选择哪种序列化实现三、实现高性能的序列化和反序列化四、小结本文来源:极客时间vip课程笔记 一、引入前提 在 TCP 的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的…

LINUX 622 SAMBA

SAMBA案例 user01通过wondows或linux在/samba/share 中创建、删除文件 环境配置 samba安装 [rootsamba caozx26]# yum install samba -y 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile 正在解决依赖关系 --> 正在检查事务…

Linux Sonic Agent 端部署(详细版)(腾讯云)

&#xff08;因为服务器是Linux的&#xff0c;只是安装了&#xff0c;并没有验证&#xff09; 1、编辑docker-compose.yml文件 在Services下添加Agent sonic-agent:image: "sonicorg/sonic-agent-linux:v2.7.2"environment:- SONIC_SERVER_HOST${SONIC_SERVER_HOST…

SpringCloud学习笔记 - 2、关于Cloud各种组件的停更/升级/替换

文章目录 前言SpringCloud是什么&#xff1f;SpringCloud 在 2018 年&#xff0c;技术体系SpringCloud 在 2020 年&#xff0c;“移除”了技术体系SpringCloud 在 2024 年&#xff0c;移除了技术体系SpringCloud 2024年&#xff0c;技术体系服务注册与发现 模块1、Eureka2、Con…

全面掌握 Nginx的功能和使用方法

从 C10K 到现代云原生 第一章 稀缺性哲学与 C10K 挑战 Nginx 的诞生并非偶然&#xff0c;它是在特定历史背景下&#xff0c;对一个严峻工程危机的直接而革命性的回应。要真正理解 Nginx 的设计精髓&#xff0c;我们必须回到 20 世纪末&#xff0c;探究那个催生了它的时代性难题…

[Linux] Vim编辑器 Linux输入输出重定向

Vim编辑器 Vim模式 command模式&#xff1a;该模式下键盘中的字母有特殊含义。如&#xff1a;G是跳转到最后一行&#xff1b;gg是跳转到第一行。 edit模式&#xff1a;在command模式下按i进入该模式。在该模式可以输入内容。在该模式下按esc返回command模式。 extended com…

用Rust写平衡三进制乘法器

1、平衡三进制乘法表 前面写了平衡三进制的加法器&#xff0c;这个乘法器是在这基础上的&#xff0c;没看过的可以回去看看&#xff0c;说到乘法器还是要参考前苏联的资料的&#xff0c;平衡三进制的乘法也是很方便的&#xff0c;在平衡三进制基础中有详细讲过&#xff0c;下图…

解决Vue2官网Webpack源码泄露漏洞

一&#xff1a;漏洞产生 Webpack是一个JavaScript应用程序的静态资源打包器。大部分Vue等应用项目会使用Webpack进行打包&#xff0c;如果没有正确配置&#xff0c;就会导致项目源码泄露&#xff0c;可能泄露的各种信息如API、加密算法、管理员邮箱、内部功能等等。 F12查看源…

新中国风通用读书颂词分享PPT模版

新国风PPT模版&#xff0c;古风影视剧PPT模版&#xff0c;天青色中国风读书颂词分享会PPT模版&#xff0c;国风通用PPT模版&#xff0c;茶味PPT模版&#xff0c;风雪夜归人PPT模版&#xff0c;小别离PPT模版&#xff0c;西江月茶词PPT模版 新中国风通用读书颂词分享PPT模版&…

Rust自动化测试的框架

Rust实现Web自动化测试的框架 以下是10个使用Rust实现Web自动化测试的框架示例,涵盖不同场景和工具链: 使用thirtyfour(基于Selenium) use thirtyfour::prelude::*;async fn example_selenium() -> WebDriverResult<()> {let caps = DesiredCapabilities::chro…

MySQL性能测试模板

引言&#xff1a;为什么MySQL性能测试如此重要&#xff1f; 你是否遇到过这些问题&#xff1a; 线上数据库突然卡顿&#xff0c;QPS暴跌&#xff1f;业务高峰期MySQL服务器CPU 100%&#xff0c;却找不到瓶颈&#xff1f;新功能上线后&#xff0c;数据库性能不升反降&#xff…