SpringBoot【3】集成 Swagger

news2024/11/27 13:51:52

SpringBoot 集成 Swagger

  • 前言
  • pom.xml 配置文件
  • application.yml 配置文件
  • config 包
    • Swagger2Config
  • entity 包
    • UserEntity
  • service 包
    • impl 包
      • SwaggerServiceImpl
    • SwaggerService
  • controller 包
    • SwaggerController
  • SwaggerApplication
  • 验证

前言

创建项目步骤、及版本选择等,在《SpringBoot【1】集成 Druid》章节中有详细介绍,此处不再重复概述。

当前先说明下,为什么需要集成 Swagger ??

  • 如下一个控制层(Controller)代码:
  • 在这里插入图片描述

若不集成 Swagger,则 在页面进行测试时,将是如下这样:
在这里插入图片描述
每次调用测试,都需要在浏览器访问。
测试多个方法时、甚是繁琐。
于是乎, 你就开始了“奇思幻想”:有没有一种办法可以不这么繁琐,而又能测试?

  • 答案呢,肯定是有的。比如呢? 集成 junit 写单元测试、或者浏览器安装插件等等。此处:我们集成Swagger 来解决此问题,注意 此处的版本是 Swagger2 (第2代)

集成之后,在进行测试,是长这样子的:
在这里插入图片描述

SpringBoot 集成 Swagger2 完成之后,项目截图如下 :

在这里插入图片描述

pom.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath />
    </parent>

    <groupId>com.junjiu.springboot.swagger</groupId>
    <artifactId>junjiu-springboot-swagger</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

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

        <!--
            以下 3个依赖是集成 Swagger2 所需
        -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>


        <!--
            UserEntity 中为了使用 @data 注解,当前添加 lombok
        -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

</project>

application.yml 配置文件


server:
  port: 5826

spring:
  application:
    name: Junjiu-Springboot-Swagger
    version: 1.0.0

config 包

Swagger2Config

package com.junjiu.springboot.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;

/**
 * program: junjiu-springboot-swagger
 * ClassName: Swagger2Config
 * description:
 *
 * @author: 九尊
 * @create: 2024-06-20 23:00
 * @version: 1.0
 **/
@EnableSwagger2
@Configuration
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.junjiu.springboot.swagger"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Swagger2")
                .description("SpringBoot 集成 Swagger2")
                .contact(new Contact("君九", "https://blog.csdn.net/charlesyuangc", "123456@email.com"))
                .termsOfServiceUrl("https://blog.csdn.net/charlesyuangc")
                .version("version 1.0")
                .build();
    }


}

entity 包

UserEntity

package com.junjiu.springboot.swagger.entity;

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

/**
 * program: junjiu-springboot-swagger
 * ClassName: UserEntity
 * description: 实体类. 对接 数据库中的表,例如:tb_user,
 *              此处为了演示 Swagger2 在实体类中的注解使用,暂不再创建表了。
 *
 * @author: 九尊
 * @create: 2024-06-20 23:07
 * @version: 1.0
 **/
@Data
@ApiModel(value = "用户实体类", description = "用户实体类")
public class UserEntity {

    /**
     * 以下 3种 写法均可以的。
     */
    // @ApiModelProperty(value = "用户ID", name = "id", required = true)
    // @ApiModelProperty(value = "用户ID", name = "id")
    @ApiModelProperty(value = "用户ID")
    private Long id;

    @ApiModelProperty(value = "用户名", name = "userName")
    private String userName;

    @ApiModelProperty(value = "昵称", name = "nickName", required = true)
    private String nickName;

}

service 包

impl 包

SwaggerServiceImpl

package com.junjiu.springboot.swagger.service.impl;

import com.junjiu.springboot.swagger.entity.UserEntity;
import com.junjiu.springboot.swagger.service.SwaggerService;
import org.springframework.stereotype.Service;

/**
 * program: junjiu-springboot-swagger
 * ClassName: SwaggerServiceImpl
 * description:
 *
 * @author: 九尊
 * @create: 2024-06-20 22:47
 * @version: 1.0
 **/
@Service
public class SwaggerServiceImpl implements SwaggerService {

    @Override
    public String setAdd(Integer numA, Integer numB) {
        Integer total = numA + numB;
        return "运行结果是:" + String.valueOf(total);
    }

    @Override
    public UserEntity getUser(Long id) {
        System.out.println("id:" + id);
        // 从数据库中查询到数据后,返回对象。
        UserEntity userEntity = new UserEntity();
        userEntity.setId(id);
        userEntity.setUserName("君九");
        userEntity.setNickName("九皇叔叔");
        return userEntity;
    }

    @Override
    public String setUpdate(UserEntity userEntity) {

        return "用户信息更新成功.";
    }
}

SwaggerService

package com.junjiu.springboot.swagger.service;

import com.junjiu.springboot.swagger.entity.UserEntity;

/**
 * program: junjiu-springboot-swagger
 * ClassName: SwaggerService
 * description:
 *
 * @author: 九尊
 * @create: 2024-06-20 22:46
 * @version: 1.0
 **/
public interface SwaggerService {

    /**
     * 测试接口 | 加法运算.
     * @param numA
     * @param numB
     * @return
     */
    String setAdd(Integer numA, Integer numB);

    /**
     * 根据用户ID编号查询用户信息.
     * @param id
     * @return
     */
    UserEntity getUser(Long id);

    /**
     * 更新用户信息.
     * @param userEntity
     * @return
     */
    String setUpdate(UserEntity userEntity);
}

controller 包

SwaggerController

package com.junjiu.springboot.swagger.controller;

import com.junjiu.springboot.swagger.entity.UserEntity;
import com.junjiu.springboot.swagger.service.SwaggerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * program: junjiu-springboot-swagger
 * ClassName: SwaggerController
 * description:
 *
 * @author: 九尊
 * @create: 2024-06-20 22:46
 * @version: 1.0
 **/
@Api(value = "Swagger 示例", tags = "Swagger 示例 Api")
@RestController
public class SwaggerController {

    @Autowired
    private SwaggerService swaggerService;

    /**
     * 测试方法 | 加法运算,需要注意此处有 2个参数
     * @param numA
     * @param numB
     * @return
     */
    @ApiOperation("加法运算方法.")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "numA", value = "第一个参数", required = true, dataType = "Integer", paramType = "path", example = "10"),
            @ApiImplicitParam(name = "numB", value = "第二个参数", required = true, dataType = "Integer", paramType = "path", example = "20")
    })
    @GetMapping("/setAdd/{numA}/{numB}")
    public String setAdd(
            @PathVariable("numA") Integer numA,
            @PathVariable("numB") Integer numB
    ) {

        return swaggerService.setAdd(numA, numB);
    }



    /**
     * 测试方法 | 根据 id编号 查询用户信息,注意:这里只有 1个参数.
     * @param id
     * @return
     */
    @ApiOperation("获取用户信息")
    @ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Long", paramType = "path", example = "1")
    @GetMapping("/getUser/{id}")
    public UserEntity getUser(@PathVariable("id") Long id){
        return swaggerService.getUser(id);
    }


    /**
     * 更新用户信息 .
     * @param userEntity
     * @return
     */
    @ApiOperation("更新用户信息")
    @ApiImplicitParam(name = "userEntity", value = "用户实体类", required = true, dataType = "UserEntity", paramType = "body")
    @PutMapping("/setUpdate")
    public String setUpdate(UserEntity userEntity) {
        return swaggerService.setUpdate(userEntity);
    }

}

SwaggerApplication

package com.junjiu.springboot.swagger;

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

/**
 * program: junjiu-springboot-swagger
 * ClassName: SwaggerApplication
 * description:
 *
 * @author: 九尊
 * @create: 2024-06-20 22:45
 * @version: 1.0
 **/
@SpringBootApplication
public class SwaggerApplication {

    public static void main(String[] args) {

        SpringApplication.run(SwaggerApplication.class, args);
    }
}

验证

启动之后,
在这里插入图片描述

在浏览器地址栏访问:
http://localhost:5826/doc.html
在这里插入图片描述

示例说明
获取用户信息 API 为例:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

从0开始C++(五):友元函数运算符重载

友元函数 介绍 C中的友元函数是一种特殊的函数&#xff0c;它可以访问和操作类的私有成员和保护成员。友元函数可以在类的内部或外部声明和定义&#xff0c;但在其声明和定义中需要使用关键字 friend 来标识。友元函数可以是全局函数&#xff0c;也可以是其他类的成员函数。 …

智慧农业解决方案:华测农机导航技术助力无人农场高效作业

在金黄的麦田、翠绿的稻田中&#xff0c;农机导航正成为无人农场的新星。如今&#xff0c;无人收割、无人播种、无人插秧等作业模式已不再是遥不可及的梦想&#xff0c;而是智慧农业快速发展中的现实写照。搭载华测导航技术的农机&#xff0c;正在田间地头忙碌。它们如同舞者般…

71-TCP协议工作原理及实战

一 服务器端 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> // 专门用于建立TCP连接并传输数据信息 #include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE namespace Ui { class M…

亲测5个电脑浏览器高效技巧,保证让你搜索效率倍增!

虽然我们每个人的电脑基本每天都会用到浏览器&#xff0c;但你会发现有的人用起浏览器就是噼里啪啦的&#xff0c;找他要个什么网站他都能快速找到&#xff0c;而有的人&#xff0c;经常打开的是广告搜索的网页&#xff0c;找不到搜索的答案非常慢。小编今天就来跟你分享一下我…

跨区域文件管控解决方案,一文了解

跨区域文件管控是一个涉及在不同地域或区域之间管理和控制文件的过程&#xff0c;它包括安全性、合规性和管理效率等多个方面。以下是一些关键的考量因素&#xff1a; 1.安全性&#xff1a;确保在传输过程中文件不被截获、篡改或泄露。使用加密技术保护文件&#xff0c;并确保传…

解释React中的“端口(Portals)”是什么,以及如何使用它来渲染子节点到DOM树以外的部分。

React中的“端口&#xff08;Portals&#xff09;”是一种将子节点渲染到DOM****树以外的部分的技术。在React应用中&#xff0c;通常情况下组件的渲染是遵循DOM的层次结构&#xff0c;即子组件会渲染在父组件的DOM节点内部。然而&#xff0c;有些情况下&#xff0c;开发者可能…

ArcGIS图斑分区(组)排序—从上到下从左到右

​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 ArcGIS图斑分区&#xff08;组&#xff09;从上到下从左到右排序 是之前的内容的升级 GIS技巧100例——12ArcGIS图斑空间排序 关于今天的内容 我们在19年已经和大家分…

Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 八、项目结果通知 1.通过企业微信通知 2.通过邮件通知 最近小编接到一个任务用来监测和巡检网…

win10手动安装stable-diffusion-webui

目录 1.python下载安装 2.git下载安装 3.stable-diffusion-webui下载 4.安装s-d-webui的依赖包&#xff08;用国内镜像提速&#xff09; 5.git下载的stable-diffusion-webui&#xff0c;依赖包提示已安装&#xff0c;但运行webui-user.bat后&#xff0c;又开始下载 6.修…

YOLOv10改进 | Neck | 添加双向特征金字塔BiFPN【含二次独家创新】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、B…

教你使用Python玩转MySQL数据库,大数据导入不再是难题!

数据分析离不开数据库&#xff0c;如何使用python连接MySQL数据库&#xff0c;并进行增删改查操作呢&#xff1f; 我们还会遇到需要将大批量数据导入数据库的情况&#xff0c;又该如何使用Python进行大数据的高效导入呢&#xff1f; 本文会一一讲解&#xff0c;并配合代码和实…

疯狂刷题python版 | 使用PySide6自制刷题软件【源码+解析】

疯狂刷题python版 | 使用PySide6自制刷题软件【源码解析】 一、前言二、思考三、软件设计四、软件实现&#xff08;一&#xff09;使用QWebEngineView控件通过JavaScript代码和chrome内核进行数据交互和逻辑控制&#xff08;二&#xff09;用户分别通过浏览器 GUI和PySide6 GUI…

秋招突击——6/19——复习{(单调队列优化)——最大子序列和,背包问题——宠物小精灵收服问题}——新作{两两交换链表中的节点}

文章目录 引言复习单调队列优化——最大子序列和思路分析实现代码参考实现 背包问题——宠物小精灵的收服问题个人实现参考实现 新作两两交换链表中的节点个人实现参考实现 删除有序数组中的重复项个人实现知识补全迭代器的访问和控制vector删除特定的元素erasevector底层删除元…

15-JS封装:入口函数

目录 1 模块化的基本结构 2 编写封装里的jQuery函数 2.1 对象本身上添加css方法 2.2 对象原型上添加css方法 2.3 自定义构造函数 2.4 优化1-伪数组 2.5 优化2-原型链 2.6 简化代码 需求&#xff1a;给页面中所有的div设置字体颜色为红色 jQuery封装&#xff1a;$("…

1964springboot VUE 智慧社区可视化平台系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE社区可视化平台系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

INFINI Labs 助力开源与教育:免费许可证计划全面升级

在数字化浪潮席卷全球的今天&#xff0c;INFINI Labs 深刻认识到开源项目和教育机构在技术创新与人才培养中的核心作用。因此&#xff0c;我们郑重推出全新升级的免费许可证计划&#xff0c;旨在全球范围内为开源社区和教育界提供有力支持&#xff0c;共同推动软件生态的繁荣与…

策略模式编程

接口定义&#xff1a; public interface ProcessParserStrategy { List<ProcessInfo> parser(String osType, String processInfo); String getApp(); } public interface ConfigParserStrategy { List<ConfigInfo> parser(String configInfo); String getConfigT…

DC/AC电源模块:为通信设备提供稳定的电力供应

BOSHIDA DC/AC电源模块&#xff1a;为通信设备提供稳定的电力供应 在现代通信系统中&#xff0c;稳定可靠的电力供应是确保信息传输连续性和服务质量的关键因素之一。DC/AC电源模块作为通信设备能源管理的核心组件&#xff0c;扮演着至关重要的角色。它不仅负责将输入的直流电…

Spring自定义标签体系和应用

我们知道&#xff0c;在使用Dubbo框架时&#xff0c;需要指定配置文件中的application、protocol、registry、provider、service等服务器端和客户端的配置项&#xff0c;典型的配置方法如下所示。通过这些配置项&#xff0c;我们可以基于Spring容器来启动Dubbo服务。 <!-- …

pytorch lighting: Trying to resize storage that is not resizable

问题 在用pytorch lighting进行训练时碰到如下错误 即 Trying to resize storage that is not resizable 。 解决方案 在dataloader采样图片以及label时&#xff0c;保证每次采样的图片的分辨率不变。