SpringBoot中集成Swagger2

news2024/11/27 15:56:50

介绍

Swagger是非常流行的API框架,能够自动生成RESTFul 风格的API文档,还可以在线测试后台接口。
使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等。
前后端分离的开发模式下,前端通过后端的API文档来进行开发和联调,效率更高。
Swagger就是帮助后端生成API文档的工具

简单使用

在SpringBoot中集成Swagger2,(等会说一个更简单的用法)。

  1. 引入依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

  1. 配置类
@Configuration
@EnableSwagger2
public class Swagger2Config {

    /**
     * 将负责生成摘要的Bean提供出去
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //是否开启 (true 开启  false隐藏。生产环境建议隐藏)
                //.enable(false)
                .select()
                //扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
                .apis(RequestHandlerSelectors.basePackage("com.liumingkai.controller"))
                //指定路径处理PathSelectors.any()代表所有的路径
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 用来设置文档元信息
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //设置文档标题(API名称)
                .title("SpringBoot中使用Swagger2接口规范")
                //文档描述
                .description("接口说明")
                //版本号
                .version("1.0.0")
                .build();
    }

}
  1. 使用
    因为Swagger帮助我们生成RestFul风格的文档,所以被修饰的接口方法必须是类似于@GetMapping@PostMapping@DeleteMapping,不能是一个笼统的@RequestMapping
    下面会有详细的常用注解说明,此处只是想要来快速看一下效果
@RestController
@RequestMapping("/user")
@Api(value = "测试接口", tags = "用户登录接口")
public class LoginController {

    @PostMapping("/login")
    @ApiOperation(value = "登录", tags = "登录接口")
    public String login(String username, String password){
        return "登录成功"+username+password;
    }

    @PostMapping("/logout")
    @ApiOperation(value="退出登录",tags = "退出登录")
    public String logout(String username){
        return "退出登录成功";
    }
}

接下来访问http://ip:port/swagger-ui.html,会看到

SpringBoot版本与Swagger版本的冲突问题

如果你访问Swagger的文档地址后,发现是404,无法访问,那么大概是SpringBoot的版本问题

注意:
如果你的SpringBoot是2.6.x及更高,那么与Swagger2是不兼容的,因为SpringMVC的处理映射匹配的方式发生了变化。
需要在SpringBoot的配置文件中通过添加配置来使springboot2.6.x以后的版本来适配Swagger2
不要试图通过@EnableWebMvc来解决,同样会导致404

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

参考文档:
SpringBoot与Swagger2版本不兼容的问题!!
Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPointerEx_Shipley_Leo的博客-CSDN博客
Springboot ✚ Swagger各版本整理_swaager 版本_qq_33334411的博客-CSDN博客
swagger-ui.html页面无法打开解决方案_Alphathur的博客-CSDN博客

常用注解

Swagger的核心就是我们常用的这几个注解

注解说明
@Api一般用在Controller类上,Swagger会扫描被此注解标注的类,并生成一个文档分类
@ApiOperation用在接口方法上,对该接口方法进行描述
@ApiModel用在实体类上,为此实体类生成说明文档
@ApiParam用来接口参数上,用来对此请求参数做说明
@ApiModelProperty用来实体类中的属性上,对此属性做说明

@Api

一般用来标注在Controller上,注意此Controller要是一个RestController。

@RestController
@RequestMapping("/user")
@Api(value = "测试接口", tags = "用户登录接口")
public class LoginController {

}

属性:

  • value , 该接口模块的名称,没啥用,对于程序员来说起一个标识作用
  • tags,该接口模块在文档中的标签名,会在API文档中显示。
    • 如果未指定此模块的tags标签,那么就会使用Controller的类名作为tags名称
    • tags可以认为是一个分类,名称相同的内容,会被归为一个分类。
  • hidden,隐藏该模块,默认是false,不隐藏,隐藏后该模块不会出现在api文档中

@ApiOperation

次注解用在方法上,对该接口进行描述。

@RestController
@RequestMapping("/user")
@Api(value = "测试接口", tags = "用户登录接口")
public class LoginController {

    @PostMapping("/login")
    @ApiOperation(value = "登录", tags = "用户登录接口")
    public String login(String username, String password){
        return "登录成功"+username+password;
    }

    @PostMapping("/logout")
    @ApiOperation(value="退出登录",tags = "用户登录接口")
    public String logout(String username){
        return "退出登录成功";
    }
}

属性:

  • value,该接口方法的名称,必填的属性,用来对接口标识作用
  • tags,用来指定该接口属于的标签,tags相同的接口方法,在文档中会属于同一个分类下
    • 一个接口方法可以属于多个分类
  • hidden,是否隐藏该接口,默认是false

@ApiParam

用在接口的参数上,用来对该参数进行修饰
属性:

  • value,标识作用
  • name,该参数的名称,如果省略该属性,则会以参数名来作为名称在文档中显示
  • required,是否必选,默认是false,此属性最常用
@RestController
@RequestMapping("/user")
@Api(value = "测试接口", tags = "用户登录接口")
public class LoginController {

    @PostMapping("/login")
    @ApiOperation(value = "登录", tags = "用户登录接口")
    public String login(@ApiParam(name="username", required = true) String username, @ApiParam(name="password",required = true) String password){
        return "登录成功"+username+password;
    }

    @PostMapping("/logout")
    @ApiOperation(value="退出登录",tags = "用户登录接口")
    public String logout(String username){
        return "退出登录成功";
    }
}

@ApiResponse

用在方法上,对接口的返回内容进行描述
常用属性:

  • code,响应的状态码
  • message,返回的描述信息
  • response,用来指定返回的实体类,也就是真正的响应数据
    @GetMapping("/detail/{username}")
    @ApiOperation("获取用户详情信息")
    @ApiResponse(code = 200,message = "查询成功",response = User.class)
    public User getDetail(@ApiParam(value = "要查询的用户名", required = true) @PathVariable("username") String username) {
        User user = new User();
        user.setAge(18);
        user.setUsername("zhagnsan");
        user.setPassword("123156");
        user.setSex("男");
        return user;
    }

@ApiResponses

如果返回的结果有多种,则可以使用@ApiResponses注解,此注解只有一个属性value,是一个@ApiResponse的数组。
其中包含多个@ApiResponse,每个@ApiResponse都是一种响应结果

    @GetMapping("/detail/{username}")
    @ApiOperation("获取用户详情信息")
    @ApiResponses({
            @ApiResponse(code = 200, message = "成功", response = User.class),
            @ApiResponse(code = 403, message = "你还没有权限")
    }
    )
    public User getDetail(@ApiParam(value = "要查询的用户名", required = true) @PathVariable("username") String username) {
        User user = new User();
        user.setAge(18);
        user.setUsername("zhagnsan");
        user.setPassword("123156");
        user.setSex("男");
        return user;
    }

@ApiModel

用在实体类上,用来对此实体类进行描述。
如果你的返回值类型或参数类型是实体类类型,那么Swagger就会使用@ApiModel对其进行描述
属性:

  • value,标识名,如果不填,则会以类名作为value
  • description,类的描述信息
    实体类上标注了此类后,会将所有的属性进行描述
@ApiModel(value="用户实体类",description = "这是返回的实体类的描述信息")
@Data
public class User {

    private String username;

    private String password;

    private String sex;

    private Integer age;

}

一般都是直接@ApiModel注解,不用属性

@ApiProperty

如果需要对实体类中的属性进行单独的设置,那么就需要使用@ApiProperty属性了
常用属性:

  • value,标识
  • name,名称,在文档中的显示的名称
  • hidden,是否隐藏此属性
  • required,此属性是否必须
@ApiModel(value="用户实体类",description = "这是返回的实体类的描述信息")
@Data
public class User {

    @ApiModelProperty(value = "用户名",required = true)
    private String username;

    @ApiModelProperty(hidden = true)
    private String password;

    private String sex;

    private Integer age;

}

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

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

相关文章

【论文阅读】Language Models are Few-Shot Learners(GPT-3)

前言 本文简要介绍了GPT-3的背景&#xff0c;模型架构&#xff0c;训练数据以及训练方式部分。具体训练细节&#xff0c;实验结果很多&#xff0c;可以在用到的时候再看 Intro 本文剖析了pretrain-finetune架构存在的问题&#xff1a; 对于每个新的任务&#xff0c;都需要大…

kotlin withTimeoutOrNull超时返回

kotlin withTimeoutOrNull超时返回 import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeoutOrNullfun main(args: Array<String>) {testTimeOut(1000) //如果是2000&#xff0c;则正常返回 OK }fun testTimeOut(…

OpenGL 坐标系统

1.简介 OpenGL希望在每次顶点着色器运行后&#xff0c;我们可见的所有顶点都为标准化设备坐标。也就是说&#xff0c;每个顶点的x&#xff0c;y&#xff0c;z坐标都应该在-1.0到1.0之间&#xff0c;超出这个坐标范围的顶点都将不可见。将坐标变换为标准化设备坐标&#xff0c;接…

在职读研探索更大的世界,中国人民大学与加拿大女王大学金融硕士给予你前行的力量

生活总是在变化中前进&#xff0c;这个世界从未停止过为我们带来新的挑战和机遇。职场中我们偶尔会感到困惑和迷茫&#xff0c;不知道该怎么去做。但我们可以选择去发现更大的世界&#xff0c;重新定义自己。中国人民大学与加拿大女王大学金融硕士项目给予你前行的力量。 知识…

建站教程:阿里云服务器安装宝塔面板搭建网站全流程

使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云服务器网以CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器&#xff0c;然后执行宝塔面板安装命令&#xff0c;系统会自动安装宝塔面板&#xff0c;安装完成后会返回面板地址、账号和密码…

浅谈集群,分布式和微服务的区别

一.概念 集群&#xff1a; 分布式&#xff1a; 微服务&#xff1a; 二.区别 集群是多台服务器一起处理同一个业务,可以使用负载均衡使得每一个服务器的负载相对平衡,集群中的一台服务器出现问题,该服务器所负责的业务可以由其他的服务器代为处理。直白一点:就是只有一个项目&…

深入理解PE,手工制作64位PE程序

深入理解PE&#xff0c;手工制作64位PE程序 文章目录 深入理解PE&#xff0c;手工制作64位PE程序手工构建64位PE程序制作准备创建一个空文件Dos头 IMAGE_DOS_HEADERNT头 IMAGE_NT_HEADERS文件头 IMAGE_FILE_HEADER可选头 IMAGE_OPTIONAL_HEADER64 节区头 IMAGE_SECTION_HEADER.…

基本 SQL 命令 、重要的 SQL命令、SQL 约束 及 SQL语句 的 执行顺序

学习目标&#xff1a; 学习目标如下&#xff1a; SQL语句执行顺序 学习内容&#xff1a; 基本 SQL 命令&#xff1a; FROMONJOINWHEREGROUP BYAGG_FUNCWITHHAVINGSELECT 从数据库中提取数据UNIONDISTINCTORDER BY 排序LIMIT 重要的sql命令&#xff1a; 1、SELECT - 从数据…

Java --- springboot3之嵌入式容器原理

目录 一、嵌入式容器 1.1、自动配置原理 1.2、相关操作 二、切换服务器 一、嵌入式容器 Servlet容器&#xff1a;管理、运行Servlet组件&#xff08;Servlet、Filter、Listener&#xff09;的环境&#xff0c;一般指服务器 1.1、自动配置原理 1、SpringBoot 默认嵌入Tomc…

打死也要学完的vue

目录 创建一个 Vue 应用# 应用实例# 根组件# 挂载应用# DOM 中的根组件模板# 应用配置# 多个应用实例# 模板语法# 文本插值# 原始 HTML# Attribute 绑定# 简写# 布尔型 Attribute# 动态绑定多个值# 使用 JavaScript 表达式# 仅支持表达式# 调用函数# 受限的全…

华为OD机试真题B卷 Java 实现【计算礼品发放的最小分组数目】,附详细解题思路

一、题目描述 又到了一年的末尾&#xff0c;项目组让小明负责新年晚会的小礼品发放工作。 为使得参加晚会的同时所获得的小礼品价值相对平衡&#xff0c;需要把小礼品根据价格进行分组&#xff0c;但每组最多只能包括两件小礼品&#xff0c;并且每个分组的价格总和不能超过一…

Calling Add-ins (C#)

本范例展示如何通过实现 IEdmAddIn5::GetAddInInfo 和 IEdmAddIn5::OnCmd 去创建一个当用户在数据卡中点击一个按钮时被调用的Visual C# add-in程序。这个add-in在用户浏览文件时打开一个对话框. add-in 将所选文件的路径复制到 文件的数据卡。 注意&#xff1a; 因为 SOLIDWO…

【图书推荐 | 12】前端系列

【赠书活动第十二期 】 图书推荐 本期书籍&#xff1a;前端系列 图书列表&#xff1a; Vue.js核心技术解析Nuxt.js实战Nuxt.js Web开发实战HTML5CSS 从入门到精通Flutter2 开发实例精解Electron项目开发实战 Vue.js核心技术解析 Nuxt.js实战 Nuxt.js Web开发实战 HTML5CSS 从入…

算法与数据结构基数排序

一、基数排序算法示意图 下方的基数排序算法的实现是利用“桶”来实现的&#xff0c;首先我们创建10个桶&#xff0c;然后按照基数入桶&#xff0c;基数的取值是从数字的低位到高位以此取值。我们还是以[62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]这个序列为例&#xff0c;…

PINN学习与实验之拟合sin(x)

首先给出数学上的知识。 1. 2. 3. 其次给出PINN最基础的理解与应用说明。 1.PINN中的MLP多层感知机的作用&#xff1f; 答&#xff1a;目的是用来拟合出我们需要的那个 常微分方程&#xff0c;即函数逼近器。 2.PINN中物理信息的作用&#xff1f; 答&#xff1a;用于约束MLP反向…

安利一个我喜欢的博主(鱼皮)的项目----鱼聪明AI

大家好&#xff0c;我是鱼皮的粉丝。今天给大家介绍下他们公司的新朋友 —— 鱼聪明&#xff01; 是不是看上去就像个大聪明哈哈&#xff0c;这其实是他们公司的吉祥物。当然啦&#xff0c;她以后会经常出现在他们的产品家族和周边中~ 比如他们最新上线的 AI 助手网站 —— 鱼…

自动化测试真的会取代手工测试?说这话的人肯定不是干测试的~

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 …

计算机网络期末考试学习记录

1.如果特别想把一个知识点给别人讲懂的话&#xff0c;那自己也会受益很多。 2.我是先讲给自己的&#xff0c;因为我本人也有太多疑问而不问。 3.答案是我自己做出来的&#xff0c;仅供参考。 1.路由器因目的不可达而丢弃的普通IP分组&#xff0c;会向源主机发送(C)报文来报告…

【每日挠头算法(4)】字符串相加|字符串相乘

欢迎~ 一、字符串相加思路&#xff1a;模拟竖式加法具体代码如下&#xff1a; 二、字符串相乘思路&#xff1a;模拟竖式乘法具体代码如下: 总结 一、字符串相加 点我直达~ 思路&#xff1a;模拟竖式加法 1.将两个字符串从右往左开始进行相加&#xff0c;使用一个变量ans表示进…

关于枚举常量手误带来的错误

前言 记录2020年5月30日&#xff0c;肯哥在群里面分享的一个因为手误带来的bug。 问题描述 肯哥原话&#xff1a; 又到了每天的open话题讨论时刻&#xff0c;一起在摸鱼中学点东西&#xff0c;今天我们来聊一个话题&#xff1a;一不小心的手误&#xff0c;代码有时能跑&#xf…