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的更多相关文章

  1. SpringBoot整合Swagger3生成接口文档

    前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...

  2. SpringBoot整合Mail发送邮件&发送模板邮件

    整合mail发送邮件,其实就是通过代码来操作发送邮件的步骤,编辑收件人.邮件内容.邮件附件等等.通过邮件可以拓展出短信验证码.消息通知等业务. 一.pom文件引入依赖 <dependency&g ...

  3. SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)

    SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...

  4. spring-boot整合mybatis(1)

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...

  5. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  6. springboot整合mq接收消息队列

    继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...

  7. springboot整合mybaits注解开发

    springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...

  8. SpringBoot整合Redis、ApachSolr和SpringSession

    SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...

  9. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

  10. SpringBoot整合Kafka和Storm

    前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...

随机推荐

  1. stencilJs学习之构建 Drawer 组件

    前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop.State.Event.Listen.Method.Component 以及生命周期方法.这些 ...

  2. Java实现常见查找算法

    Java实现常见查找算法 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找. 线性查找 线性查找(Linear Search)是一种简单的查 ...

  3. 如何理解DDD中的值对象

    引言 实体和值对象是领域驱动设计中的两个重要概念.相对实体而言,值对象更加抽象,理解起来也更晦涩一些.那么该如何理解值对象?我们先来看一下<实现领域驱动设计>书中对值对象的定义: 值对象 ...

  4. Redis系列24:Redis使用规范

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  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 ...

  6. Jellyfin Documentation

    Skip to main content     Introduction On this page Welcome to the Jellyfin Documentation Jellyfin is ...

  7. 10 Myths About Introverts

    By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...

  8. 使用Github Copilot完成代码编写

    上篇文章,我们使用VSCode创建了T.Global解决方案和两个类库工程,接下来我们使用Github Copilot完成代码编写 先说以下业务需求: 提供一个公共的本地化组件,支持对数字.货币.时间 ...

  9. log4j漏洞CVE-2021-44228复现-排雷篇

    一.环境搭建(用相同的环境才能保证一定成功) 下载vulhub,其他环境可能存在GET请求无效问题: git clone https://github.com/vulhub/vulhub.git 切换 ...

  10. CSP2021游记

    题外话 中午十二点半到了考场.没到时间不让进,恰巧发现 lhm 在对面饭店于是去讨论了一下上午 J 组的题,复习了线段树板子( 等到进考场坐好的时候已经两点半了,看考号本来以为我们同机房三个同学会坐一 ...