springboot 之 整合springdoc2.6 (swagger 3)

news2024/12/21 21:59:39

版本

springboot 3.3.5

jdk 17

springdoc 2.6.0

依赖pom

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.6.0</version>
</dependency>

注解对比 swagger 2 与 3

在这里插入图片描述

可选:配置信息(如果没啥特殊配置,可以不写)

package com.test.swagger.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringDocConfig {

    @Bean
    public OpenAPI openAPI(){
        return new OpenAPI()
                //设置接口文档基本信息
                .info(this.getOpenApiInfo());
    }

    private Info getOpenApiInfo(){
        return new Info()
                //标题
                .title("SpringBoot3集成springDoc")
                //描述
                .description("SpringBoot3集成springDoc示例文档")
                //作者信息
                .contact(new Contact().name("enjoy").url("").email("123456789@qq.com"))
                .license(new License().name("apache 2.0").url("这是个假的url"))
                //概述信息
                .summary("springboot 3.3 集成 springdoc 2.6")
                .termsOfService("这是个假的url")
                //版本
                .version("3.x - 2.6");
    }

    /**
     * 接口分组
     */
    @Bean("AGroupApi")
    public GroupedOpenApi agroupedOpenApi(){
        return GroupedOpenApi.builder()
                .group("AGroupApi")
                .pathsToMatch("/person/**")
                .build();
    }

    /**
     * 接口分组
     */
    @Bean("BGroupApi")
    public GroupedOpenApi bgroupedOpenApi(){
        return GroupedOpenApi.builder()
                .group("BGroupApi")
                .pathsToMatch("/person/**")
                .build();
    }
}

实体类

package com.test.swagger.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Data
@Schema(description = "用户实体类")
public class Person {
    /**
     * 真实姓名
     */
    @Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED)
    private String userName;
    /**
     * 地址
     */
    @Schema(description = "用户地址")
    private String address;
    /**
     * 电话号码
     */
    @Schema(description = "用户电话")
    private String phoneNumber;
    /**
     * 身份证号码
     */
    @Schema(description = "用户地址")
    private String idCard;
}

接口类

package com.test.swagger.controller;

import com.test.swagger.entity.Person;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

/**
 * http://localhost:8080/swagger-ui/index.html
 * 访问接口地址
 */
@RestController
@RequestMapping(value = "/person")
@Tag(name = "person接口" , description = "这只是一个描述")
public class SwaggerTestApiController {

    @Operation(
            summary = "根据Id查询用户信息", description = "根据ID查询用户信息,并返回响应结果信息",
            //入参
            parameters = {
                    @Parameter(name = "id", description = "用户ID", required = true, example = "1")
            },
            //返回值
            responses = {
                    @ApiResponse(
                            responseCode = "200",
                            description = "响应成功",
                            content = @Content(
                                    mediaType = "application/json",
                                    schema = @Schema(
                                            title = "实体类",
                                            description = "返回实体",
                                            implementation = Person.class
                                    )
                            )
                    ),
                    @ApiResponse(
                            responseCode = "500",
                            description = "响应失败",
                            content = @Content(schema = @Schema())
                    )
            }
    )
    @GetMapping("hello")
    public Person getHello(){
        Person user = new Person();
        user.setUserName("小明");
        user.setPhoneNumber("123456789");
        user.setAddress("中国辽宁省葫芦岛");
        user.setIdCard("52462545262256562");
        return user;
    }

    @Operation(summary = "新增用户", description = "新增用户",
            responses ={
                    @ApiResponse(
                            responseCode = "200",
                            content = { @Content(schema = @Schema(implementation = Person.class), mediaType = "application/json") }),
                    @ApiResponse(
                            responseCode = "404",
                            description = "User not found.", content = { @Content(schema = @Schema()) })
            }
    )
    @PostMapping("addPerson")
    public Person addPerson(@RequestBody Person person){
        Person user = new Person();
        user.setUserName("小明");
        user.setPhoneNumber("123456789");
        user.setAddress("中国辽宁省葫芦岛");
        user.setIdCard("52462545262256562");
        return user;
    }

    @DeleteMapping("deletePerson/{id}")
//    @Operation(summary = "新增用户", description = "新增用户", hidden = true)
//    @Hidden
    public boolean deletePerson(
            @Parameter(description = "用户id")
            @PathVariable int id){
        System.out.println("deletePerson: " + id);
        return true;
    }

    @PutMapping("editPerson")
    public Person editPerson(
            @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "User to add.", required = true)
            @RequestBody Person person){
        System.out.println("editPerson");
        return null;
    }
}

测试

运行项目,访问地址: http://localhost:8080/swagger-ui/index.html

web总览

在这里插入图片描述

接口详情

在这里插入图片描述

总结

现在接口开发和测试插件各种各样,接口文档生成插件也非常多,真没必要只关注swagger一个。写接口文档相关代码都比实际接口代码都多了,真的麻烦。

实际开发中,接口在设计初期就已经有相关文档,如果测试接口,可以直接使用 cool request插件直接在IDEA测试。如果说后面需要在接口改动后再次生成接口文档,也可以使用其他插件,比如 JApiDocs , 自动生成接口文档了。

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

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

相关文章

ADS学习笔记 5. 微带天线设计

基于ADS2023 update2 参考书籍&#xff1a;卢益锋老师《ADS射频电路设计与仿真学习笔记》 更多笔记&#xff1a;ADS学习笔记 1. 功率放大器设计ADS学习笔记 2. 低噪声放大器设计ADS学习笔记 3. 功分器设计ADS学习笔记 4. 微带分支定向耦合器设计 目录 0、设计指标 1、微带…

TypeORM在Node.js中的高级应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 引言 TypeORM 基本概念 1. 实体&am…

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…

【云岚到家】-day10-2-冷热处理及统计

【云岚到家】-day10-2-冷热处理及统计 3.7 历史订单3.7.1 冷热分离方案1&#xff09;冷热分离需求2&#xff09;分布式数据库3&#xff09;冷热分离方案 3.7.2 订单同步1&#xff09;创建历史订单数据库2&#xff09;订单同步3&#xff09;测试订单同步4&#xff09;小结 3.7.3…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

新人如何做好项目管理?|京东零售技术人成长

“管理是一种实践&#xff0c;其本质不在于知&#xff0c;而在于行”——彼得德鲁克 作为一名初入职场的校招生&#xff0c;你是否有过这样的疑问&#xff1a;项目经理究竟扮演着怎样的角色&#xff1f;是老板的传声筒&#xff0c;单纯地传达上级的指令&#xff1f;还是团队的…

MySQL社区版的启动与连接

1.启动&#xff1a; 注意&#xff1a;MySQL是默认开机自启的 方式一&#xff1a; 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称&#xff0c;然后鼠标右键点击启动 方式二&#xff1a; 1.在开始选项中搜索“cmd”命令提示符&#xff0c;使用管理员身份运行 …

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame&#xff0c;然后再次转成 AVPacket&#xff0c;那么这AVPakcet数据要怎么办呢&#xff1f;分为三种情况&#xff1a; 一种是将AVPacket存储成h264文件&#xff0c;由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上)&#xff1a;成熟可靠的传输层协议-CSDN博客 &#x1f95d;在上篇博客中&#xff0c;我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨&#xff0c;提供了初步的理解和概览。本…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

菲涅耳全息图

菲涅耳全息图&#xff1a;记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…

Pygame坦克大战游戏开发实验报告

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中&#xff0c;循环是一种非常强大的控制结构&#xff0c;它允许我们重复执行一段代码直到满足某个条件为止。在微搭中&#xff0c;我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

C++:基于红黑树封装map和set

目录 红黑树的修改 红黑树节点 红黑树结构 红黑树的迭代器 红黑树Insert函数 红黑树的默认成员函数 修改后完整的红黑树 set、map的模拟实现 set map 测试封装的set和map 红黑树的修改 想要用红黑树封装map和set&#xff0c;需要对之前实现的key-value红黑树进行修…

【深度学习基础 | 预备知识】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议&#xff0c;运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100]&#xff0c;可以&#xff1a; 还可以换map里…

从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi

sophpi 是 算能官方针对 sg200x 系列的 SDK 仓库 https://github.com/sophgo/sophpi &#xff0c;支持 cv180x、cv81x、sg200x 系列的芯片。 SG2002 简介 SG2002 是面向边缘智能监控 IP 摄像机、智能猫眼门锁、可视门铃、居家智能等多项产品领域而推出的高性能、低功耗芯片&a…

【客户服务】互联网时代客户投诉处理金点子

互联网时代客户投诉新特点 客户投诉渠道广投诉的内容涉及到企业的各个方面客户维权意识越来越强负面效应很难管 卓越客户体验成为企业核心竞争力 移动互联网与社会化媒体背景下&#xff0c;客户的全方位感知、情感、卓越体验、高效需求成为驱动技术、应用、终端以及服务持续…

SQL 审核在 CloudQuery 的四大场景应用

数据库作为数据的核心载体&#xff0c;其安全性和稳定性对业务的影响至关重要。而在我们日常业务中&#xff0c;SQL 编写不当是引起数据库故障的一个重要原因&#xff0c;轻则影响数据库性能&#xff0c;重则可能直接导致「雪崩」。因此&#xff0c;SQL 审核作为 SQL 代码投入生…

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期完整示例1. 创建 Vue 项目&#xff08;如果还没有&#xff09;2. 定义和使用组件3. 在主应用中使用组件4. 运行应用完整项目结构 参考文献 概述 V…