[Java实战]Spring Boot 整合 Swagger2 (十六)

[Java实战]Spring Boot 整合 Swagger2 (十六)

一、Swagger 的价值与痛点
为什么需要 API 文档工具?
  • 开发阶段:前后端高效协作,实时验证接口
  • 测试阶段:提供标准化测试用例
  • 维护阶段:降低新人理解成本,快速迭代
  • 对外输出:开放平台必备能力,提升开发者体验
传统文档的痛点
  • 手动维护耗时易错
  • 代码与文档割裂,更新不同步
  • 缺乏可视化测试工具
二、Spring Boot 整合 Swagger2 的 3 种姿势
1. 基础整合(5分钟极简配置)

步骤

  1. 添加依赖
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>
  1. 配置 Swagger 主类
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage("com.example.controller")).paths(PathSelectors.any()).build().apiInfo(apiInfo());}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("订单系统API文档").description("接口统一管理说明").version("1.0").contact(new Contact("DevTeam", "https://example.com", "contact@example.com")).build();}
}
  1. 访问文档
http://localhost:8080/swagger-ui.html

在这里插入图片描述

2. 深度定制(企业级配置)

场景一:接口分组

// 后台管理接口分组
@Bean
public Docket adminApi() {return new Docket(DocumentationType.SWAGGER_2).groupName("管理后台").select().apis(input -> input.getHandlerMethod().getMethodAnnotation(AdminOnly.class) != null).build();
}// 移动端接口分组
@Bean
public Docket mobileApi() {return new Docket(DocumentationType.SWAGGER_2).groupName("移动端").select().paths(PathSelectors.ant("/api/mobile/**")).build();
}

场景二:全局参数配置

Docket docket = new Docket(...).globalOperationParameters(Arrays.asList(new ParameterBuilder().name("Authorization").description("JWT令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build()));

场景三:UI 美化(Knife4j)

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-ui</artifactId><version>3.0.3</version>
</dependency>

访问地址变为:http://localhost:8080/doc.html

3. 整合 Spring Security(权限控制)

问题:Swagger 页面被拦截
解决方案

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/swagger-ui.html").permitAll().antMatchers("/webjars/**").permitAll().antMatchers("/swagger-resources/**").permitAll().antMatchers("/v2/api-docs").permitAll().anyRequest().authenticated().and().csrf().disable();}
}
三、Swagger 注解全解析
注解作用位置核心属性
@ApiController 类tags(分组名)、description
@ApiOperation接口方法value(简述)、notes(详情)
@ApiParam方法参数name、required、example
@ApiModel实体类description
@ApiModelProperty实体类字段value、required、hidden
@ApiIgnore类/方法/参数隐藏指定元素

示例代码

@Api(tags = "用户管理", description = "注册登录相关接口")
@RestController
@RequestMapping("/user")
public class UserController {@ApiOperation("用户登录")@PostMapping("/login")public Result<User> login(@ApiParam(value = "用户名", required = true, example = "admin") @RequestParam String username,@ApiParam("密码") @RequestParam String password) {// ...}@ApiIgnore // 隐藏废弃接口@Deprecated@GetMapping("/old")public String oldMethod() { return "deprecated"; }
}
四、生产环境最佳实践
  1. 按环境开关 Swagger
@Profile({"dev", "test"}) // 只在开发测试环境启用
@Configuration
@EnableSwagger2
public class SwaggerConfig { ... }
  1. 敏感接口过滤
Docket docket = new Docket(...).select().apis(Predicates.not(RequestHandlerSelectors.withMethodAnnotation(InternalApi.class))).build();
  1. 文档导出离线使用
  • 访问 /v2/api-docs 获取 JSON
  • 使用 Swagger Editor 导入生成 HTML
  1. 版本升级建议
  • Swagger2:维护模式,适合已有项目
  • SpringDoc(Swagger3):新项目推荐,支持 OpenAPI 3.0
    <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.9</version>
    </dependency>
    
五、高频问题排查
问题现象原因分析解决方案
访问 404路径被拦截或依赖缺失检查安全配置,确认依赖版本正确
模型字段未显示未添加 @ApiModelProperty检查注解并设置 hidden = false
接口描述乱码响应头未指定编码添加 @RequestMapping(produces = "application/json;charset=UTF-8")
文件上传参数异常Swagger 默认表单类型限制添加 @ApiParam 并指定 dataType = "__File"
六、总结

Spring Boot 整合 Swagger2 能够显著提升 API 管理效率,但需注意:

  • 开发阶段:合理使用注解增强文档可读性
  • 测试阶段:利用 UI 快速验证接口逻辑
  • 生产环境:严格管控文档访问权限,避免信息泄露

附录

  • Swagger 官方文档
  • SpringDoc 迁移指南
  • Knife4j 增强方案

希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!

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

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

相关文章

系统稳定性之上线三板斧

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

题海拾贝:P1833 樱花

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

摆脱拖延症的详细计划示例

以下是一个以一周为周期&#xff0c;帮助你摆脱拖延症的详细计划示例&#xff0c;你可以根据自己的实际情况进行调整和完善。 --- # 摆脱拖延症一周计划 ## 一、计划目标 通过一系列有针对性的方法和行动&#xff0c;逐步克服拖延习惯&#xff0c;提高任务执行效率和自我管理…

实物工厂零件画图案例(上)

文章目录 滑台气缸安装板旋转气缸安装板张紧调节块长度调节块双轴气缸安装板步进电机安装板梯形丝杆轴承座 简介&#xff1a;案例点击此处下载&#xff0c;这次的这几个案例并没有很大的难度&#xff0c;练习这几个案例最为重要的一点就是知道&#xff1a;当你拿到一个实物的时…

【Nova UI】十六、打造组件库之滚动条组件(中):探秘滑块的计算逻辑

序言 在上篇文章中&#xff0c;我们完成了滚动条组件开发的前期准备工作&#xff0c;包括理论推导、布局规划和基础设置。现在&#xff0c;我们将把这些准备转化为实际代码&#xff0c;开启滚动条组件的具体开发之旅&#x1f31f;。我们会详细阐述如何实现各项功能&#xff0c…

laravel 使用异步队列,context带的上下文造成反序列化出问题

2025年5月8日17:03:44 如果你是单个应用&#xff0c;异步递交任务&#xff0c;是在应用内部使用&#xff0c;一般不会发生这样的问题 但是现在app项目是 app是一个应用&#xff0c;admin是一个应用&#xff0c;app吧为了接口性能吧异步任务丢给admin去执行&#xff0c;如果两个…

深入剖析 MyBatis 位运算查询:从原理到最佳实践

深入剖析 MyBatis 位运算查询&#xff1a;从原理到最佳实践 引言 在数据库设计中&#xff0c;位运算是一种高效存储和查询多选字段的常用技术。然而&#xff0c;在实际开发中&#xff0c;特别是在使用 MyBatis 这样的 ORM 框架时&#xff0c;位运算查询往往会遇到一些意想不到…

01 | 大模型微调 | 从0学习到实战微调 | AI发展与模型技术介绍

一、导读 作为非AI专业技术开发者&#xff08;我是小小爬虫开发工程师&#x1f60b;&#xff09; 本系列文章将围绕《大模型微调》进行学习&#xff08;也是我个人学习的笔记&#xff0c;所以会持续更新&#xff09;&#xff0c;最后以上手实操模型微调的目的。 (本文如若有…

代码随想录算法训练营第三十八天|动态规划part6(完全背包2)

322. 零钱兑换 题目链接&#xff1a; 322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a; 代码随想录 思路&#xff1a; 确定递推公式&#xff1a; dp[j]min(dp[j],dp[j-coins[i]]1); 由于是完全背包 &#xff0c;所以遍历顺序是正序 还存在另一…

使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践

一、效果概览 本文基于 Vue 3 和 ECharts GL&#xff0c;实现了一个具有以下特性的 3D 饼图&#xff1a; 立体视觉效果&#xff1a;通过参数方程构建 3D 扇形与底座动态交互&#xff1a;支持点击选中&#xff08;位移效果&#xff09;和悬停高亮&#xff08;放大效果&#xff…

Transformer Decoder-Only 参数量计算

Transformer 的 Decoder-Only 架构&#xff08;如 GPT 系列模型&#xff09;是当前大语言模型的主流架构&#xff0c;其参数量主要由以下几个部分组成&#xff1a; 嵌入层&#xff08;Embedding Layer&#xff09;自注意力层&#xff08;Self-Attention Layers&#xff09;前馈…

(自用)Java学习-5.8(总结,springboot)

一、MySQL 数据库 表关系 一对一、一对多、多对多关系设计外键约束与级联操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查询 基础查询&#xff1a;SELECT * FROM table WHERE...聚合函数&#xff1a;COUNT()…

【日撸 Java 三百行】Day 11(顺序表(一))

目录 Day 11&#xff1a;顺序表&#xff08;一&#xff09; 一、关于顺序表 二、关于面向对象 三、代码模块分析 1. 顺序表的属性 2. 顺序表的方法 四、代码及测试 拓展&#xff1a; 小结 Day 11&#xff1a;顺序表&#xff08;一&#xff09; Task&#xff1a; 在《数…

Spring Boot动态配置修改全攻略

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用&#xff0c;实时更新配置的终极指南 在微服务架构中&#xff0c;动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案&#xff0c…

精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联

精益数据分析&#xff08;55/126&#xff09;&#xff1a;双边市场模式的挑战、策略与创业阶段关联 在创业和数据分析的学习旅程中&#xff0c;我们持续探索不同商业模式的奥秘。今天&#xff0c;依旧怀揣着与大家共同进步的想法&#xff0c;深入研读《精益数据分析》&#xf…

linux内核pinctrl/gpio子系统驱动笔记

目录 一、简单介绍二、主要源码文件和目录gpio子系统pinctrl子系统两个子系统之间的关系设备树例子 三、主要的数据结构gpio子系统pinctrl子系统 四、驱动初始化流程五、难点说明 一、简单介绍 GPIO子系统: Linux GPIO子系统是Linux内核中负责处理GPIO&#xff08;通用输入输出…

Vue 2 项目中配置 Tailwind CSS、Font Awesome和daisyUI

Vue 2 项目中配置 Tailwind CSS 和 安装 daisyUI 首先重点注意&#xff0c;Vue2中安装Tailwind和daisyui一定要注意版本。 最佳版本 使用 Vue 2 TailwindCSS v2 DaisyUI v1 的兼容版本 "tailwindcss": "npm:tailwindcss/postcss7-compat^2.2.17", &q…

5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件

JDBC&#xff1a; 预编译SQL优点&#xff1a;安全&#xff0c;性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis&#xff1a; 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。&#xff08;连接池中的连接可以复用&#…

探索科技的前沿动态:科技爱好者周刊

探索科技的前沿动态:科技爱好者周刊 在信息爆炸的时代,我们每时每刻都被新技术、新理念包围。而如何在这纷繁复杂的信息中找到对自己有价值的内容,成了一大挑战。今天,我们要介绍的是一个宝贵的资源——科技爱好者周刊,它致力于为科技爱好者提供优质的科技资讯,每周五发…

Vue3 官方宣布淘汰 Axios,拥抱Alova.js

过去十年,Axios 凭借其简洁的API设计和浏览器/Node.js双环境支持,成为前端开发者的首选请求库。但随着现代前端框架的演进和工程化需求的升级,Alova.js 以更轻量、更智能、更符合现代开发范式的姿态登场。 一、Axios的痛点 1,冗余的适配逻辑,比如Axios的通用配置(但实际…