spring boot整合Swagger2(2.9.2版本)

news2024/9/29 5:25:07

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


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


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

文章目录

  • Swagger2简介
  • 开发环境:
  • 实现步骤说明
    • 1. 搭建项目
    • 2. 引入依赖
    • 3. 创建启动类
    • 4. Swagger配置类
    • 5. 创建实体类
    • 6. 返回包装类
    • 7. 创建控制类
    • 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解析并展现

下面介绍的就是2.9.2版本


开发环境:

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

实现步骤说明

1. 搭建项目

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

2. 引入依赖

引入spring boot和swagger2依赖
注:这里可能因为版本兼容问题,我试了很多个版本都会出现报错,目前来看2.3.4.RELEASE版本是可以和swagger的2.9.2版本配合使用的

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>

        <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>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>

3. 创建启动类

SwaggerApplication.java

package com.swagger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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


4. Swagger配置类

Swagger2Config.java
配置了一些定制参数

package com.swagger.config;

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.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @ClassDescription:
 * @Author:李白
 * @Date:2023/5/22 16:18
 */

@Configuration
@EnableSwagger2 //开启swagger2
public class Swagger2Config {


    /**
     * 创建RESTFUL API文档内容
     * @return
     */
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                //此处参数为ApiInfo对象
                //指定构建api文档的详细信息的方法
                .apiInfo(apiInfo())
                .select()
                //指定构建api接口的包路径-指定具体包路径
//                .apis(RequestHandlerSelectors.basePackage("com.provider.controller"))
                //指定构建api接口的包路径-此处为所有包(未指定)
                .apis(RequestHandlerSelectors.any())
                //访问路径下面的接口
//                .paths(PathSelectors.any())
//                .paths(PathSelectors.ant("/libai/**"))
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //可根据url路径设置那些请求加入文档,忽略哪些请求
                .paths(PathSelectors.any())
                .build()
                //分组管理可以与哪个访问路径结合使用
//                .groupName("用户管理")
                ;
    }

    /**
     * 创建API界面的基本信息
     * @return 返回一个构建好的ApiInfo对象
     */
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                //界面标题
                .title("Swagger2构建Restful API文档")
                //接口描述
                .description("后端API接口文档展示")
                //联系方式,联系人-网址-邮箱
                .contact(new Contact("libai","https://github.com/libai","libai@163.com"))
                //版本信息
                .version("1.0.0")
                //证书描述
                .license("访问主页")
                //证书地址
                .licenseUrl("https://www.baidu.com")
                //系统服务网址
                .termsOfServiceUrl("http://gitgub.com/libai")
                //以上全部,开始构建
                .build();
    }
}




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. 返回包装类

ResponseResult.java

package com.swagger.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

/**
 * @ClassDescription: 返回结果集
 * @Author:李白
 * @Date:2023/5/20 13:58
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseResult implements Serializable {
    private Integer code;
    private String message;
    private Object result;

    public static ResponseResult success(){
        ResponseResult responseResult = new ResponseResult();
//        responseResult.setResult(result);
        responseResult.setCode(200);
        responseResult.setMessage("success");
        return responseResult;
    }

    public static ResponseResult success(Object result){
        ResponseResult responseResult = new ResponseResult();
        responseResult.setResult(result);
        responseResult.setCode(200);
        responseResult.setMessage("success");
        return responseResult;
    }

}

7. 创建控制类

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相关注解

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

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

8. 查看生成的文档

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

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

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


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

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

相关文章

计算机组成原理-中央处理器-指令流水线和多处理器

目录 一、指令流水线基本概念 1.1影响流水线的因素 1.1.1结构相关(资源冲突) 1.1.2 数据相关(数据冲突) 1.1.3 控制相关(控制冲突) 1. 2 流水线分类 二、流水线的多发技术 2.1 超标量技术 2.2 超流水技术 2.3 超长指令字 三、五段式指令流水线 四、多处理器系统基本概念…

I.MX RT1170加密启动详解(1):Encrypted Boot image组成

使用RT1170芯片构建的所有平台一般都是高端场合&#xff0c;我们需要考虑软件的安全需求。该芯片集成了一系列安全功能。这些特性中的大多数提供针对特定类型攻击的保护&#xff0c;并且可以根据所需的保护程度配置为不同的级别。这些特性可以协同工作&#xff0c;也可以独立工…

chatgpt赋能python:Python中的区间:什么是区间(Interval),如何使用区间

Python 中的区间&#xff1a;什么是 区间&#xff08;Interval&#xff09;&#xff0c;如何使用区间 在Python中&#xff0c;区间&#xff08;Interval&#xff09;是一个广泛使用的数据结构&#xff0c;用于表示一段连续的数据范围。使用区间可以更方便地处理各种数据类型&a…

本地搭建CFimagehost私人图床【公网远程访问】

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

代码随想录算法训练营第四十一天 | 力扣 343. 整数拆分, 96.不同的二叉搜索树

343. 整数拆分 题目 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 解析 1.确定dp数组&#xff08;dp table&#xff09;以及下标的…

史上最详细的使用Claude和接入Claude-api教程

是什么&#xff08;What&#xff09; Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争对手。Claude 的研发公司是专注人工智能安全和研…

Java制作520表白代码——爱一个人需要理由吗?

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;Java经典程序设计 520表白日&#xff0c;每个人都期待着浪漫的表白&#xff0c;而作为一名热爱编程的程序员&#xff0c;我决定用程序员的方式来向你表达我的爱意。 在2023年5月20日这个特殊的日子里&#xff0c;我要用一段特别的…

BM1684X-onnx模型转化为bmodel

1&#xff1a;在tpu-mlir目录下进入docker docker run --privileged --name tpu-mlir -v $PWD:/workspace -it sophgo/tpuc_dev:v2.2 原因&#xff1a;该镜像已创建&#xff0c;要么重新创建一个新进程&#xff0c;要么杀死老进程&#xff1b; 解决办法如下&#xff1a; 2:接着…

夜深人静学32系列17——OLED

夜深人静学32系列17——OLED OLED简介接口定义OLED驱动原理驱动函数OLED.COLED.HCubeMX配置 实战部分效果展示驱动代码 OLED简介 LED&#xff0c;即有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;又称为有机激光显示&#xff08;Organic El…

基于YOLOV5的道路损伤(GRDDC‘2020)检测

1. GRDDC2020 数据集介绍 GRDDC2020 数据集是从印度、日本和捷克收集的道路图像。包括三个部分&#xff1a;Train, Test1, Test2。训练集包括带有 PASCAL VOC 格式 XML 文件标注的道路图像。 缺陷类型&#xff1a;D00、D01、D11、D10、D20、D40、D43、D44、D50、D0w0…

Otsu阈值法原理及实现

文章目录 Otsu算法简介Otsu 算法的逻辑源码实现 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Otsu算法简介 Otsu阈值法发表于1979年&#xff0c;论文为A threshold selection method from gray level histograms,作者是日本东京大学的…

序列模型基础概念

一、公式定义 在时间 t t t观察到 x t x_{t} xt​&#xff0c;那么得到 T T T个不独立的随机变量 ( x 1 , . . . , x T ) − p ( X ) (x_{1},...,x_{T})-p(X) (x1​,...,xT​)−p(X) 由条件概率公式&#xff1a; p ( a , b ) p ( a ) p ( b ∣ a ) p ( b ) p ( a ∣ b ) p(a,…

chatgpt赋能python:Python中局部变量的介绍

Python中局部变量的介绍 在Python中&#xff0c;局部变量是在函数中定义的变量&#xff0c;其范围限制在该函数内部。每当函数被调用时&#xff0c;局部变量将被创建并且只在函数的执行期间存在。当函数执行结束时&#xff0c;局部变量将被销毁。 局部变量是在函数内部定义的…

代码随想录算法训练营第四十六天 | 力扣 139.单词拆分

139.单词拆分 题目 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 解析 1.确定dp数组以及下标的含义 …

Windows上GIT配置文件的位置

Git作为常见的版本控制系统。在Windows上&#xff0c;我偶尔在CLI上使用官方的版本&#xff1a; Git for Windows 。本文简单介绍Windows下的git配置文件。 系统和全局的gitconfig 配置文件因环境而异&#xff08;Windows 原生的cmd、Windows shell 或 MSYS2 shell&#xff09;…

chatgpt赋能python:Python中如何取消列表

Python中如何取消列表 在Python中使用列表是一种非常常见的数据结构&#xff0c;它允许我们在其中存储任意数量的元素&#xff0c;并且可以非常容易地进行遍历和操作。但是&#xff0c;有时候我们需要从列表中删除元素。这个过程并不难&#xff0c;但是有些细节需要注意。本文…

写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)

一、前言 MySQL官方安装包下载地址&#xff1a;   https://dev.mysql.com/downloads/mysql/   Docker Hub官方网址&#xff1a;   https://hub.docker.com/ 如果需要了解Centos7下MySQL5.7最新版的安装部署&#xff0c;可参考教程【最新MySQL-5.7.40在云服务器Centos7.…

《深入理解计算机系统(CSAPP)》第9章虚拟内存 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

chatgpt赋能python:Python中对列表求和-一篇全面介绍和使用建议的SEO文章

Python中对列表求和 - 一篇全面介绍和使用建议的SEO文章 什么是Python中的列表&#xff1f; 在Python中&#xff0c;列表&#xff08;List&#xff09;是一种非常有用的数据结构&#xff0c;它是一组有序的元素集合。列表能够存储多个元素&#xff0c;每个元素都可以是不同的…

Ubuntu20.04安装VMware player16.2.4,不弹出安装界面的问题

1.先在官网上下载VMware player16.2.4进行下载&#xff0c;Ubuntu20.04对VMware player16.2.4进行安装 2.安装完成后&#xff0c;应该会有如图下的弹窗界面&#xff0c;但是我没有 解决方法&#xff1a; 点击Ubuntu的VMware player的程序图标&#xff0c;弹窗报错:"Comma…