SpringBoot整合Swagger3
1、导入相关依赖
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!--swagger-ui-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2、编写配置类
package com.ly.laboratory.config;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023-10-15 15:58
* @tags 喜欢就去努力的争取
*/
@Configuration
@EnableOpenApi// Swagger 开启生成接口文档功能
public class Swagger3Config {
/**
* application中还配置了mvc,因为springboot与swagger3不兼容
*/
/**
* ture 启用Swagger3.0, false 禁用(生产环境要禁用)
*/
// 是否开启swagger,正式环境一般是需要关闭的,可根据springboot的多环境配置进行设置
@Value("${knife4j.enable}")
private Boolean swaggerEnabled;
@Bean
public Docket webApiConfig() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(webApiInfo())
// 是否开启
.enable(swaggerEnabled)
.groupName("webApi")
.select()
// 扫描的路径使用@Api的controller
.apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
// 指定路径处理 PathSelectors.any()代表所有的路径
//.paths(PathSelectors.any())
// 只显示api路径下的页面
.paths(PathSelectors.regex("/api/.*"))
.build();
}
@Bean
public Docket adminApiConfig() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(adminApiInfo())
// 是否开启
.enable(swaggerEnabled)
.groupName("adminApi")
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
// 只显示admin路径下的页面
.paths(PathSelectors.regex("/admin/.*"))
.build();
}
private ApiInfo webApiInfo() {
return new ApiInfoBuilder()
.title("网站门户-API文档")
.description("本文档描述了网站门户接口定义")
.version("1.0")
.contact(new Contact("ly", "https://www.cnblogs.com/ybbit", "startybbit@163.com"))
.build();
}
private ApiInfo adminApiInfo() {
return new ApiInfoBuilder()
.title("后台管理-API文档")
.description("本文档描述了后台管理系统接口定义")
.version("1.0")
.contact(new Contact("ly", "https://www.cnblogs.com/ybbit", "startybbit@163.com"))
.build();
}
}

3、使用
package com.qbb.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qbb.common.R;
import com.qbb.entity.User;
import com.qbb.entity.vo.UserVo;
import com.qbb.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2022-10-25 20:52
* @tags 我爱的人在很远的地方, 我必须更加努力
*/
//@Api(tags = "用户管理")
@Tag(name = "用户管理")
@RestController
@RequestMapping("/admin/user")
@CrossOrigin
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
//@ApiOperation(value = "用户列表", notes = "用户列表")
@Operation(summary = "用户列表")
@GetMapping("/list/{pageNo}/{pageSize}")
public R page(
/*@ApiParam(value = "当前页", defaultValue = "1")*/
@Parameter(name = "pageNo", description = "当前页")
@PathVariable(value = "pageNo", required = false) Integer pageNo,
/*@ApiParam(value = "每页记录数", defaultValue = "10")*/
@Parameter(name = "pageSize", description = "每页记录数")
@PathVariable(value = "pageSize", required = false) Integer pageSize,
/*@ApiParam(value = "searchObj查询条件")*/
@Parameter(name = "userVo", description = "searchObj查询条件")
UserVo userVo) {
Page<User> page = new Page<>(pageNo, pageSize);
return R.ok().data(userService.pageList(page, userVo));
}
@Operation(summary = "保存用户")
@PostMapping("/save")
public R save(@Parameter(name = "user", description = "用户对象") @Valid @RequestBody User user) {
boolean flag = userService.save(user);
if (flag) {
return R.ok();
}
return R.error().message("保存失败!");
}
}
4、注意:启动项目会报错 ===> java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
解决办法:在配置文件中加入以下配置即可
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
5、访问:http://localhost:你的port/doc.html

SpringBoot整合Swagger3的更多相关文章
- SpringBoot整合Swagger3生成接口文档
前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...
- SpringBoot整合Mail发送邮件&发送模板邮件
整合mail发送邮件,其实就是通过代码来操作发送邮件的步骤,编辑收件人.邮件内容.邮件附件等等.通过邮件可以拓展出短信验证码.消息通知等业务. 一.pom文件引入依赖 <dependency&g ...
- SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)
SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...
- spring-boot整合mybatis(1)
sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot整合mq接收消息队列
继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...
- springboot整合mybaits注解开发
springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
随机推荐
- stencilJs学习之构建 Drawer 组件
前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop.State.Event.Listen.Method.Component 以及生命周期方法.这些 ...
- Java实现常见查找算法
Java实现常见查找算法 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找. 线性查找 线性查找(Linear Search)是一种简单的查 ...
- 如何理解DDD中的值对象
引言 实体和值对象是领域驱动设计中的两个重要概念.相对实体而言,值对象更加抽象,理解起来也更晦涩一些.那么该如何理解值对象?我们先来看一下<实现领域驱动设计>书中对值对象的定义: 值对象 ...
- Redis系列24:Redis使用规范
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- Go语言系列——01-HelloWorld、02-命名规范、03-变量、04-类型、05-常量、06-函数(Function)、07-包、08-if-else语句、09-循环、10-switch语句
文章目录 01-HelloWorld 一 建立 Go 工作区 二 运行 Go 程序 2.1 hello world 程序代码介绍 02-开发环境搭建 一 下载地址 二 安装 Linux安装 Windo ...
- Jellyfin Documentation
Skip to main content Introduction On this page Welcome to the Jellyfin Documentation Jellyfin is ...
- 10 Myths About Introverts
By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...
- 使用Github Copilot完成代码编写
上篇文章,我们使用VSCode创建了T.Global解决方案和两个类库工程,接下来我们使用Github Copilot完成代码编写 先说以下业务需求: 提供一个公共的本地化组件,支持对数字.货币.时间 ...
- log4j漏洞CVE-2021-44228复现-排雷篇
一.环境搭建(用相同的环境才能保证一定成功) 下载vulhub,其他环境可能存在GET请求无效问题: git clone https://github.com/vulhub/vulhub.git 切换 ...
- CSP2021游记
题外话 中午十二点半到了考场.没到时间不让进,恰巧发现 lhm 在对面饭店于是去讨论了一下上午 J 组的题,复习了线段树板子( 等到进考场坐好的时候已经两点半了,看考号本来以为我们同机房三个同学会坐一 ...