Springboot整合Swagger2(3.0.0版本)

news2024/11/25 2:33:06

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

文章目录

  • Swagger2简介
  • 开发环境:
  • 实现步骤说明
    • 1. 搭建项目
    • 2. 引入依赖
    • 3. application.yml
    • 4. 创建启动类
    • 5. 创建实体类
    • 6. 创建控制类
    • 7. 添加swagger2相关注解
    • 8. 查看生成的文档


Swagger2简介

swagger2是一个基于OpenAPI(OpenAPI Specification,OAS)构建的开源工具,提供对REST API文档的一些有效帮助。简而言之就是将项目中的controller类和方法通过注解方式生成文档展现出来。
swagger包含三个内容:

  • swagger codegen:通过OpenApi规范定义任何api生成服务器存根和客户端sdk来简化构建过程
  • swagger editor: 浏览器编辑器,用来编写OpenApi规范
  • swagger ui: 可以在浏览器上查看并操作REST API

两个组件:

  • springfox-swagger2: 这个组件用于自动生成描述API的json文件
  • springfox-swagger-ui: 将描述API的json解析并展现

3.0.0版本比2.9.2更新了什么:

  • 支持spring5,Webflux(仅支持请求映射,不支持功能端点)
  • 支持spring integration
  • 支持starter自动配置(springfox-boot-starter)
  • 支持自动完成文档化配置
  • 支持OpenApi 3.0.3
  • 支持兼容2.0版本
  • 兼容性说明(Java8及以上版本,spring5.x及以上版本,springboot2.2以上版本)

开发环境:

JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.5.6 springboot搭建传送门

实现步骤说明

1. 搭建项目

创建maven项目引入springboot依赖
项目包框架如下
注:这里使用3.0.0版本的swagger,不需要配置SwaggerConfig配置类
在这里插入图片描述

2. 引入依赖

引入spring boot和swagger2依赖
注:这里可能因为版本兼容问题,我试了很多个版本都会出现报错,目前来看2.5.6版本是可以和swagger的3.0.0版本配合使用的
注:其他版本需要配置一个参数,传送门-->:spring boot整合swagger3.0.0版本兼容配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
<!--            <version>2.5.6</version>-->
<!--            <version>2.6.3</version>-->
<!--            <version>2.6.5</version>-->
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>

3. application.yml

spring:
  mvc:
    pathmatch:
      #这里配置的这个参数是为了解决spring boot和swagger版本不兼容的问题
      matching-strategy: ant_path_matcher

4. 创建启动类

注:这里发现一个现象,正常是需要在启动类上添加@EnableOpenApi注解来开启功能的,但是我在项目中不用这个注解,且请求接口类上也不加这个注解,启动项目后也是可以看到接口文档的,发现有没有这个注解都是一样的。
SwaggerApplication.java

package com.swagger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.oas.annotations.EnableOpenApi;

/**
 * @ClassDescription:
 * @Author:李白
 * @Date:2023/5/22 14:57
 */
//@EnableOpenApi//不用好像也可以
@SpringBootApplication
public class SwaggerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SwaggerApplication.class, args);
    }
}

5. 创建实体类

UserInfo.java

package com.swagger.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @ClassDescription:
 * @Author:李白
 * @Date:2023/5/22 16:00
 */
@ApiModel(value = "用户实体类", description = "用户实体类描述")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
    @ApiModelProperty(name = "id", value = "学生姓名", example = "12345")
    private Integer id;
    @ApiModelProperty(name = "username", value = "用户账号", example = "12345")
    private String username;
    @ApiModelProperty(name = "password", value = "用户密码", example = "12345")
    private String password;
}


6. 创建控制类

UserController.java

package com.swagger.controller;

import com.swagger.entity.UserInfo;
import com.swagger.vo.ResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassDescription:
 * @Author:李白
 * @Date:2023/5/22 15:01
 */
@Api(value = "用户数据操作类",tags = {"用户数据操作接口"})
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 模拟数据库
     */
    static Map<Integer, UserInfo> users = new HashMap<>();

    /**
     * 模拟自增主键
     */
    static Integer id = 1;

    /**
     * 查询所有数据
     * @return
     */
    @ApiOperation(value = "查询用户数据", notes = "查询所有用户数据")
    @GetMapping
    public ResponseResult getUserInfoList(){
        List<UserInfo> userInfoList = new ArrayList<>(users.values());
        return ResponseResult.success(userInfoList);
    }

    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    @ApiOperation(value = "根据id查询数据", notes = "根据id查询数据信息")
//    @ApiParam(name = "id", value = "用户id", required = true)
//    @ApiImplicitParam(name = "id", value = "用户id", dataType = "Integer", paramType = "query",example = "libai123", required = true)
    @GetMapping("/{id}")
    public ResponseResult getUserInfoById(@PathVariable("id") Integer id){
        return ResponseResult.success(users.get(id));
    }

    /**
     * 新增数据
     * @param userInfo
     * @return
     */
//    @ApiIgnore//用在类或方法上,可以不被swagger显示在页面上
//    @ApiResponses({@ApiResponse(code = 200, message = "ok", response = UserInfo.class)})
    @ApiOperation(value = "新增数据", notes = "新增用户数据信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "用户名", required = true),
            @ApiImplicitParam(name = "password", value = "用户密码", required = true)
    })
    @PostMapping
    public ResponseResult postUserInfo(UserInfo userInfo){
        userInfo.setId(id++);
        users.put(userInfo.getId(),userInfo);
        System.out.println(users);
        return ResponseResult.success();
    }

    /**
     * 更新数据
     * @param userInfo
     * @return
     */
    @ApiOperation(value = "更新数据", notes = "更新用户数据")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "用户名", required = true),
            @ApiImplicitParam(name = "password", value = "用户密码", required = true)
    })
    @PutMapping
    public ResponseResult putUserInfo(UserInfo userInfo){
        UserInfo userInfo1 = users.get(userInfo.getId());
        userInfo1.setPassword(userInfo.getPassword());
        userInfo1.setUsername(userInfo.getUsername());
        return ResponseResult.success(userInfo1);
    }

    /**
     * 删除数据
     * @param id
     * @return
     */
    @ApiOperation(value = "删除数据", notes = "根据id删除用户数据")
    @ApiImplicitParam(name = "id", value = "用户id", required = true)
    @DeleteMapping("/{id}")
    public ResponseResult deleteUserInfo(@PathVariable("id") Integer id){
        users.remove(id);
        return ResponseResult.success();
    }




}

7. 添加swagger2相关注解

在实体类和控制类上添加相应的注解
注解介绍如下:

  • 在主类(程序启动类)上添加注解@EnableOpenApi开启swagger
  • 在controller类上添加@Api
  • 在实体类上添加@ApiModel
  • 实体类(对象)属性添加@ApiModelProperty
  • 接口参数描述使用@ApiImplicitParams
  • 接口响应使用@ApiResponses
  • 接口忽略(可不在网页中显示)使用@ApiIgnore

8. 查看生成的文档

启动项目
浏览器中访问地址(端口号可根据自己的项目端口更改,默认为8080)

http://localhost:8080/swagger-ui/index.html

(3.0.0版本为上面这个地址,2.9.2的老版本则为http://localhost:8080/swagger-ui.html)
如下图
在这里插入图片描述


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

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

相关文章

SpringCloudAlibaba下篇(GateWay,Skywalking)(超级无敌认真好用,万字收藏篇!!!!)

文章目录 SpringCloudAlibaba下篇(GateWay,Skywalking)1 GateWay1.1 什么是网关1.2 GateWay介绍1.3 GataWay的基本使用1.4 GataWay整合Nacos1.5 断言路由工厂1.5.1 内置断言路由工厂1.5.2 自定义断言路由工厂 1.6 过滤器工厂1.6.1 内置局部过滤器工厂1.6.2 自定义局部过滤器1.6…

手撕code(2)

文章目录 1 设计模式1.1 单例模式1.1.1 懒汉单例1.1.2 饿汉单例1.1.3 总结 1.2 简单工厂模式 2 实现智能指针 1 设计模式 1.1 单例模式 某个类&#xff0c;不应该有多个实例&#xff0c;此时就可以使用单例模式。如果尝试创建多个实例&#xff0c;编译器就会报错。 1.1.1 懒…

【踩坑】mirai挂机运行经常自动退出怎么办?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 背景介绍 解决思路 实现方法 最终效果 背景介绍 就是说&#xff0c;后台运行了mcl&#xff0c;但经常莫名其妙自动会退出&#xff0c;导致每次都得手动的去服务器上重新启动mcl。而对于自己运行的需要用…

“老年养生”APP的设计与开发

摘要&#xff1a;我国人口老龄化呈上升趋势&#xff0c;老年人口比重增加。这是我国经济发展的一大挑战&#xff0c;也是老年健康产业的一大机遇。随着我国经济发展&#xff0c;越来越多的人开始关注自己的身体&#xff0c;这导致各种关于健康的网络应用层出不穷。但是经过分析…

正则表达式与通配符 -- *?在正则表达式与通配符中的区别

1、前言 最近因为工作需要写一些自动化脚本&#xff0c;里面需要用到正则表达式来匹配特定的字符串&#xff0c;于是查了一些正则表达式相关的资料。资料里面都提到&#xff1a;*匹配前面的子表达式0次或任意多次。我当时就纳闷&#xff0c;*到底是表示的是匹配的次数还是可以…

2. JVM内存模型深度剖析与优化

JVM性能调优 1. JDK的体系结构2. Java语言的跨平台特性3.JVM整体结构及内存模型3.1 内存模型3.1.1 PC寄存器&#xff08;线程私有&#xff09;3.1.2 虚拟机栈&#xff08;线程私有&#xff09;1. 局部变量表2. 操作数栈 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确…

SimpleCG绘图函数(3)--绘制矩形

前面我们已经学习了点和线的绘制,本篇我们继续绘图函数学习----矩形的绘制&#xff0c;也就是长方形的绘制,并给出一个绘制楼房的例子演示矩形的应用。 所有绘制矩形相关函数如下&#xff1a; //以下矩形左上角坐标(left, top)&#xff0c;右下角坐标(right,bottom ) //以线条…

跨境电商系统开发-电商商城系统平台定制方案

随着业务的拓展&#xff0c;不少企业开始将目光转向国外市场&#xff0c;那么如何定制一套属于想自己的跨境出海电商商城方案呢&#xff1f;需要做好以下关口把关&#xff1a; 欢迎名片交流探讨开发平台流程 买家端(h5/pc/app) www.mardao.cn 账号 密码 卖家端(h5/pc)…

八、(重点)视图集ModelViewSet自定义action路由routers

上一章&#xff1a; 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 九、DRF生成API文档_做测试的喵酱的博客-CSDN博客 一、视图集ModelViewSet与ReadOnlyViesSet ModelViewSet视图集 与 ReadOnly…

基于FPGA:运动目标检测(包围盒仿真工程,及一些调试问题)

目录 前言一、安装器件库二、仿真工程操作1、进入文件列表2、找到bounding_box_locate.vt&#xff0c;双击打开文件3、修改路径4、路径设置5、切换回“Hierarchy”&#xff0c;即工程界面6、运行仿真7、查看波形 重点&#xff1a;调试问题三、仿真代码1、仿真顶层文件2、绘制包…

node篇-fs模块儿

nodejs-fs模儿 异步 1. mkdir() 创建一个目录 // 1.mkdir 创建一个目录&#xff0c;回调函数的参数含义&#xff1a;err const fs require(fs); fs.mkdir(./avater,(err)>{console.log(err);if(err && err.code EEXIST){console.log(当前目录已经存在)} }) 当我…

华硕天选4R FA617原装Windows11原厂预装系统工厂模式恢复安装带 ASUSRecevory 一键还原22H2版本

华硕天选4R FA617X原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16…

浅谈NoSQL数据库

数据库 数据库&#xff0c;又称为数据管理系统&#xff0c;是处理的数据按照一定的方式储存在一起&#xff0c;能够让多个用户共享、尽可能减小冗余度的数据集合&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所。 数据库有&#xff1a;Oracle数据库、ACCESS数…

代码随想录算法训练营第四十五天 | 力扣 70. 爬楼梯(进阶), 322. 零钱兑换, 279.完全平方数

70. 爬楼梯&#xff08;进阶&#xff09; 题目 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff…

【浅学 JDBC】

浅学JDBC 笔记记录 一、1. JDBC的概念2. JDBC快速入门2.1 DriverManager2.2 Connection2.3 Statement2.4 ResultSet 3. JDBC入门案例使用3.1 查询所有学生信息3.2 根据id查询学生信息&&新增学生信息&&修改学生信息&&删除学生信息 一、 1. JDBC的概念 …

中科易安8周年,与你相约联网智能门锁

中科易安与物联网技术发展同频 持续推动安防信息化建设 打造多场景应用的数智化通行解决方案 促进技术与安全精准对接 联网智能门锁技术硬核 中科易安打造集NB-IoT、Sub-1G Cat.1、Wifi、RS485和BLE 5.0 在内的六大通信技术组网方案 以“联网”赋能智能门锁 实现通行数…

C++11之atomic原子操作

atomic介绍 多线程间是通过互斥锁与条件变量来保证共享数据的同步的&#xff0c;互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候&#xff0c;对共享资源的访问主要是对某一数据结构的读写操作&#xff0c;如果数据结构本身就带有排他性访问的特性&#xff0c…

chatgpt赋能python:Python中的等待:理解和优化

Python中的等待&#xff1a;理解和优化 Python是一种强大的编程语言&#xff0c;在构建各种应用程序时很常用。但是&#xff0c;随着应用程序越来越复杂&#xff0c;需要等待一些操作时&#xff0c;Python中的等待传统上会导致性能下降。在这篇文章中&#xff0c;我们将深入了…

可持续能源技术改变世界

文章目录 一、你在工作或生活中接触过可持续能源技术吗&#xff1f;可以分享下你的经历与看法。二、你认为可持续能源技术的优势和挑战有哪些&#xff1f;三、你了解过可持续能源技术的应用现状吗&#xff1f;四、对于可持续能源技术真的否改变世界这个问题你怎么看&#xff1f…

ifconfig工具与驱动交互解析(ioctl)

Linux ifconfig&#xff08;network interfaces configuring&#xff09; Linux ifconfig命令用于显示或设置网络设备。ifconfig可设置网络设备的状态&#xff0c;或是显示目前的设置。同netstat一样&#xff0c;ifconfig源码也位于net-tools中。源码位于net-tools工具包中&am…