SpringBoot实战:整合Swagger3实现在线Api文档

news2024/12/24 21:54:48

Swagger-UI 是 HTML、Javascript、CSS 的一个集合,可以动态地根据注解生成在线 Api 文档;swagger-bootstrap-UI 则可以美化 swagger-ui,页面更清爽!本篇就是实现 SpringBoot 整合 Swagger3 实现在线 Api 文档。

项目源码实现前分支地址:https://toscode.gitee.com/li_ziheng/lizhengi-samples/tree/feature%2Fspring-boot-1.0.1/

项目源码实现后分支地址:https://toscode.gitee.com/li_ziheng/lizhengi-samples/tree/feature%2Fspring-boot-1.0.2/

本篇内容包括:项目介绍与条件准备、项目搭建与构造、效果验证


文章目录

    • 一、项目介绍与条件准备
        • 1、项目使用框架/模块介绍
        • 2、Swagger-UI 常用注解
        • 3、项目结构说明
    • 二、项目搭建与构造
        • 1、添加项目 maven 依赖
        • 2、启动类添加注解
        • 3、添加 Swagger-UI 的配置类
        • 4、controller 控制层添加 Swagger 注解
        • 5、实体对象 VO 实现
        • 6、controller 控制层实现
        • 7、控制台输出 Swagger 接口文档地址
    • 三、效果验证
        • 1、控制台输出
        • 2、Swagger-UI


一、项目介绍与条件准备

1、项目使用框架/模块介绍

  • Swagger-UI:Swagger-UI 是 HTML、Javascript、CSS 的一个集合,可以动态地根据注解生成在线 Api 文档;
  • swagger-bootstrap-UI:可以美化 swagger-ui,页面更清爽!

2、Swagger-UI 常用注解

  • @Api 注解:用于修饰 Controller 类,生成 Controller 相关文档信息;
  • @ApiOperation 注解:用于修饰 Controller 类中的方法,生成接口方法相关文档信息;
  • @ApiParam 注解:用于修饰接口中的参数,生成接口参数相关文档信息;
  • @ApiModelProperty 注解:用于修饰实体类的属性,当实体类是请求参数或返回结果时,直接生成相关文档信息。

3、项目结构说明

├── config — 配置文件POJO

├── controller — 控制层(将请求通过 url 匹配,分配到不同的接收器/方法进行处理,然后返回结果)

├── service — 服务层接口

​ └── impl — 服务层实现

├── mapper — 数据访问层,与数据库交互为 service 提供接口

├── entity — 实体对象

​ ├── converter — 实体对象转换器

​ ├── dto — 持久层需要的实体对象(用于服务层与持久层之间的数据传输对象)

​ └── vo — 视图层需要的实体对象(用于服务层与视图层之间的数据传输对象)

├── utils — 工具类

└── Application.java — 入口启动类


二、项目搭建与构造

1、添加项目 maven 依赖

# 添加项目 maven 依赖,pom.xml 文件添加内容如下:

        <!--Swagger-UI API文档生产工具-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--Swagger-UI 优化界面UI -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>

2、启动类添加注解

# 启动类添加 @EnableWebMvc 注解

package com.lizhengi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

/**
 * @author lizhengi
 */
@SpringBootApplication
@EnableWebMvc
public class LizhengiSampleSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(LizhengiSampleSpringBootApplication.class, args);
    }

}

3、添加 Swagger-UI 的配置类

# Swagger2 API 文档的配置

package com.lizhengi.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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author liziheng
 * @version 1.0.0
 * @description Swagger2 API 文档的配置
 * @date 2022-12-09 12:12 上午
 **/
@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //为当前包下controller生成API文档
                .apis(RequestHandlerSelectors.basePackage("com.lizhengi.controller"))
                //为有@Api注解的Controller生成API文档
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                //为有@ApiOperation注解的方法生成API文档
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerUI演示")
                .description("SwaggerUI演示")
                .contact("lizhengi")
                .version("1.0")
                .build();
    }
}

4、controller 控制层添加 Swagger 注解

# Swagger3Config Swagger3 API 文档的配置

package com.lizhengi.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;

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.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author liziheng
 * @version 1.0.0
 * @description Swagger3 API 文档的配置
 * @date 2022-12-09 03:12 上午
 **/
@Configuration
public class Swagger3Config {

    /**
     * API 文档信息
     *
     * @return -
     */
    @Bean
    public Docket api() {
        // 自动生成文档接口:http://localhost:8080/v3/api-docs
        // API接口文档界面:http://localhost:8080/swagger-ui/index.html
        // Swagger UI 界面:http://localhost:8080/doc.html
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.liziheng.demo.controller"))
                .paths(PathSelectors.regex("/article/*.*|/api/v1/*.*|/*.*"))
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfo(
                "Swagger API 文档",
                "后台管理系统相关的接口",
                "v1",
                "协议地址",
                new Contact("li", "https://github.com/", "@163.com"),
                "MIT License", "http://opensource.org/licenses/MIT",
                Collections.emptyList());
    }

    /**
     * 解决swagger在springboot2.7以后的空指针异常
     *
     * @return -
     */
    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {

        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                        .filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    assert field != null;
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }
}

5、实体对象 VO 实现

# EventVO Event-事件 视图层实体对象实现

package com.lizhengi.entity.vo;

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

import java.util.List;

/**
 * @author liziheng
 * @version 1.0.0
 * @description Event-事件 视图层实体对象实现
 * @date 2022-12-09 0:58 上午
 **/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EventVO {

    /**
     * 事件名称
     */
    @ApiModelProperty("事件名称")
    private String eventName;

    /**
     * 事件类型
     */
    @ApiModelProperty("事件类型")
    private String eventType;

    /**
     * 事件发生时间
     */
    @ApiModelProperty("事件发生时间")
    private String eventDate;

    /**
     * 事件地点
     */
    @ApiModelProperty("事件地点")
    private String eventLocation;

    /**
     * 事件人物
     *
     * @see CharacterVO
     */
    @ApiModelProperty("事件人物")
    private List<CharacterVO> characters;

    /**
     * 事件描述
     */
    @ApiModelProperty("事件描述")
    private String eventDescription;
}

# CharacterVO Character-人物 视图层实体对象实现

package com.lizhengi.entity.vo;

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

/**
 * @author liziheng
 * @version 1.0.0
 * @description Character-人物 视图层实体对象实现
 * @date 2022-12-09 00:59 上午
 **/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CharacterVO {

    @ApiModelProperty("人物名称")
    private String name;

    @ApiModelProperty("人物介绍")
    private String profile;

    @ApiModelProperty("人物登场时间(负数表示公元前)")
    private Integer appearanceDate;
}

6、controller 控制层实现

# EventController Event-事件 Controller

package com.lizhengi.controller;

import com.lizhengi.entity.vo.EventVO;
import com.lizhengi.service.impl.EventServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author liziheng
 * @version 1.0.0
 * @description Event-事件 Controller
 * @date 2022-12-07 8:17 下午
 **/
@Api(tags = "EventController")
@RestController
@RequestMapping("/api/lizhengi/event")
public class EventController {

    EventServiceImpl eventService;

    @Autowired
    public void setEventService(EventServiceImpl eventService) {
        this.eventService = eventService;
    }

    @ApiOperation("全量获取事件信息")
    @RequestMapping(path = {"/list"}, method = RequestMethod.GET)
    public List<EventVO> getEventDtoList() {
        return eventService.getEventDtoList();
    }
}

7、控制台输出 Swagger 接口文档地址

# SwaggerPrintConfig 控制台输出 Swagger 接口文档地址

package com.lizhengi.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.net.Inet4Address;
import java.net.UnknownHostException;

/**
 * @author liziheng
 * @version 1.0.0
 * @description 控制台输出 Swagger 接口文档地址
 * @date 2022-12-09 3:28 上午
 **/
@Component
@Slf4j
public class SwaggerPrintConfig implements ApplicationListener<WebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        try {
            // 获取IP
            String hostAddress = Inet4Address.getLocalHost().getHostAddress();
            // 获取端口号
            int port = event.getWebServer().getPort();
            // 获取应用名
            String applicationName = event.getApplicationContext().getApplicationName();
            // 打印 swagger 文档地址
            log.info("项目启动启动成功!swagger3 接口文档地址: http://" + hostAddress + ":" + port + applicationName + "/swagger-ui/index.html");
            // 打印 swagger2 文档地址
            log.info("项目启动启动成功!swaggerUI 接口文档地址: http://" + hostAddress + ":" + port + applicationName + "/doc.html");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

三、效果验证

1、控制台输出

image-20221209034153337

2、Swagger-UI

image-20221209034251204

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

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

相关文章

物联网开发笔记(58)- 使用Micropython开发ESP32开发板之控制2.90寸电子墨水屏模块黑白套件

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制2.90寸电子墨水屏模块&#xff08;黑白套件&#xff09;。 二、环境 ESP32 2.90寸 电子墨水屏模块 Thonny IDE 几根杜邦线 接线方法&#xff1a; 三、墨水屏驱动 此处注意注意&#xff1a;不同的型号、不同厂家的墨…

web前端期末大作业 基于HTML+CSS+JavaScript绿色的在线教育平台网站响应式企业网站模板

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

C++学习笔记(十七)——list的模拟实现

需要实现的三个类及其成员函数接口总览 结点类的模拟实现 构造函数 迭代器类的模拟实现 迭代器类存在的意义 迭代器类的模板的参数说明 构造函数 运算符的重载 --运算符的重载 运算符的重载 !运算符的重载 *运算符的重载 ->运算符的重载 list的模拟实现 默认成…

Pr:导出设置之元数据

元数据 METADATA模块可设置有关媒体文件的一组说明性信息。元数据可以包含创建日期、文件格式和时间轴标记等信息。 导出选项Export Options决定如何将 XMP 元数据与导出文件一起保存。说明&#xff1a;XMP eXtensible Metadata Platform&#xff0c;扩展元数据平台&#xff0c…

R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型

介绍 最近我们被客户要求撰写关于向量自回归的研究报告&#xff0c;包括一些图形和统计输出。向量自回归&#xff08;VAR&#xff09;模型的一般缺点是&#xff0c;估计系数的数量与滞后的数量成比例地增加。因此&#xff0c;随着滞后次数的增加&#xff0c;每个参数可用的信息…

软件架构设计 :VO,BO,PO,DO,DTO的理解

文章目录前言一、小总结一下二、详细理解&#xff11;、Persistant Object(持久对象)个人理解2、 Business Object(业务对象)个人理解3.DTO&#xff08;Data Transfer Object&#xff09;数据传输对象个人理解5、VO&#xff08;Value Object&#xff09;值对象个人理解VO和DTO的…

web前端期末大作业 html+css+javascript化妆品网页设计实例 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

c++ - 第16节 - map和set

1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。那什么是关联…

【Linux】进程控制(详细解析)

文章目录一.进程创建初识fork函数fork函数返回值写时拷贝fork常规用法fork调用失败的原因二.进程终止进程退出场景进程退出码进程常见退出方法1.return2.exit3._exit三.进程等待进程等待的必要性获取子进程状态status进程等待的方法wait方法waitpid方法基于非阻塞接口的轮询检测…

python操作redis

目录 python操作redis 安装redis模块 基本链接 连接池连接 redis字符串操作 redis hash操作 redis 列表操作 redis 其它操作 redis管道 django中集成redis python操作redis 安装redis模块 pip install redis基本链接 # 第一步&#xff1a;导入Redis类 from redis …

Linux网络原理及编程(7)——第十七节 网络层

目录 IP报头 网段划分 私有IP地址和公网IP地址 补充一下路由器 的有关知识&#xff1a; 路由 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&#xff08;公众…

【玩转c++】c++ 中 STL 简介

本期主题&#xff1a;介绍cSTL&#xff08;标准模板库&#xff09;博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐身为程序员 &#xff0c;不会有人没有女朋友吧。 &#x1f341;1.什么是STL&…

[趣味][人工智能生成文字]chatGPT使用教程

ChatGPT 首先点击sign up注册&#xff0c;注册需要非中国手机号获取验证码&#xff0c;这里感谢一下alice的支援&#xff0c;没有好朋友的各位看到这里可以先去逛逛淘宝 注册后点击log in登录 然后直接输入想要生成的内容&#xff0c;点击右侧的小箭头 注意&#xff1a;根据Op…

cef浏览器加载过程实测ILoadHandler和IRequestHandler

针对方法GetResourceRequestHandler获取资源请求过程中,会多次发生请求,不知道何时加载完的问题,IRequestHandler没有了OnResourceLoadComplete和OnBeforeResourceLoad方法,如何判断是否加载完。使用browser.isLoading并不能真正的判断。所以想到了 OnFrameLoadEnd OnFram…

【STM32】详解独立看门狗的本质和使用步骤代码

一、看门狗 1、介绍 作为一个检测装置&#xff0c;发生意外情况能够报告并处理突发意外——复位。 复位中断属于不可屏蔽中断&#xff0c;属于优先级最高的中断 2、作用 两个看门狗&#xff08;独立看门狗和窗口看门狗&#xff09;均可用于检测并解决由软件错误导致的故障&…

设计没灵感,一定要逛这5个网站。

本期给大家分享几个设计灵感网站&#xff0c;希望对设计师们有所帮助&#xff0c;话不多说直接上内容。 1、dribbble Dribbble - Discover the World’s Top Designers & Creative Professionals Dribble是一个很大的设计作品共享网站&#xff0c;也涵盖了很丰富的设计作…

HTTP 和 HTTPS 它们之间的区别在哪里?

您可能已经听说过很多有关互联网术语 HTTP 和 HTTPS 的信息。您知道两者之间的区别是什么吗&#xff1f;HTTP 在随着技术的不断更新已经慢慢开始消失在互联网之中。在浏览器的地址栏中&#xff0c;您访问的每个网站的 URL 始终以 HTTP 或 HTTPS 开头&#xff0c;而目前 HTTPS 协…

SSM校园网报修系统计算机毕业论文java毕业设计选题源代码

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《SSM校园网报修系统》该项目采用技术&#xff1a;jsp springmvcspringmybatis cssjs等相关技术&#xff0c;项目含有源码、文档、配套开发软件、…

02源码分析-ThreadLocal详解-并发编程(Java)

文章目录1 ThreadLocal内部结构2 主要方法源码分析2.1 set()方法2.1.1 getMap()2.1.2 createMap()2.1.3 ThreadLocalMap.set()2.1.4 replaceStaleEntry()2.1.5 expungeStaleEntry()2.1.6 cleanSomeSlots()2.1.7 rehash()2.1.8 expungeStaleEntries()2.1.9 resize()2.2 get()方法…

Minitab使用图形渲染和数据描述

Minitab使用图形渲染和数据描述 Minitab是最流行的质量、分发和分析程序之一&#xff0c;实际上是OMNITAB软件的一个较小版本。六西格玛的软件是开发组织质量开发和改进的合适工具&#xff0c;具有处理、计算、分析、报告和其他数据工具的强大能力。的确如此。在本软件的上下文…