栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot基础学习之整合Swagger框架(上篇)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot基础学习之整合Swagger框架(上篇)

前言:

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。


这个SpringBoot基础学习系列用来记录我学习SpringBoot框架基础知识的全过程 (这个系列是参照B站狂神的SpringBoot最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)

之后我将会尽量以一天一更的速度更新这个系列,还没有学习SpringBoot的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧!加油吧!少年们!


由于篇幅较长,所以这里我将其分为了上下两篇博客,上篇主要了解Swagger的概念,学习SpringBoot整合Swagger,以及配置Swagger和扫描接口;下篇主要学习Swagger配置是否启动 和 设置Swagger文档注释,以及Swagger在线测试等

今天我们来到了SpringBoot基础学习的第九站:整合Swagger框架(上篇)。废话不多说,让我们开始今天的学习内容吧!

9.Swagger的使用

学习目标:

  • 了解Swagger的作用和概念
  • 了解前后端分离
  • 在SpringBoot中集成Swagger
9.1 Swagger简介

在介绍Swagger之前,先来了解一下什么是前后端分离?因为Swagger的出现就是为了方便管理前后端分离项目

9.1.1 什么是前后端分离?

到2021年了,“前后端分离”这个名词想必大家都不陌生了,因为目前市场上的很多项目都是前端采用 Vue框架,后端采用SpringBoot框架的设计方案。

这里我简单说一下我对前后端分离的理解,前后端分离从字面上看也就是说前端和后端分离开了,那为什么要分离开嘞?

下面我就从分工合作、工作效率还有代码管理三个方面解释一下:

分工合作方面:大家还记得在初学JavaWeb时,被Servlet和JSP支配的恐惧吗?我们很多时候不得不在前端的JSP页面里写一堆Java后端代码;这就意味着,设计过程必须先由后端程序员编写后端的Java代码,然后前端程序员编写前端JSP代码,如果前端想要渲染数据,还要让后端程序员在前端JSP页面写后端代码,先不说这个工作流程麻不麻烦,如果前端程序员想要修改一些功能,还要求着后端程序员来改,我前端程序员还得看你后端程序员脸色是吧,大家都是要面子的是吧,改来改去谁也嫌麻烦,万一后端和前端干起来了,项目经理还得花时间劝架,大伙不仅可能面临加班,而且项目可以又要延期上线!

工作效率方面:在JSP时代,前后端想同时进行是不太可能的事情,往往都是先写Java后端代码,然后再写JSP页面中的前端代码,然后再写JSP页面里的后端代码,这样一来一回的,同时进行是不可能的事情。但如果前后端分离之后,在项目的整体设计方案敲定后,前端和后端只需要提前商量好,大家调用事先设计好的接口,然后接收和发送对应的数据进行处理就完事了,这样前端后端同时进行,不仅有了更多的时间去做前期的需求分析和详细设计,也能有充裕的时间进行系统的测试,保证项目的整体质量,甚至能够提前上线!

代码管理方面:在前端的JSP页面是写一堆后端Java代码,不仅后端程序员觉得别扭,前端程序员也觉得别扭 (前端程序员如果懂都后端还行,不懂后端代码,估计是一脸懵逼吧),而且这也违反了软件设计中的“高内聚,低耦合”原则,前端后端代码糅杂在一起,这耦合度确实挺高的,后期维护起来,那得后端程序员得和前端程序员一起上,不仅浪费时间,还浪费人力。

接下来跟大家聊一下后端时代和前后端分离时代的一些主要区别:

9.1.2 后端时代和前后端分离时代区别

后端时代:

刚开始前端只用管理静态页面,也就是html页面,然后交给后端进行处理;后来出现了模板引擎,也就是JSP (Java Server Page,即Java服务器页面),这时候后端是主力 (哈哈,也就是说,那个时候后端程序员要比前端程序员工资高)

前后端分离时代:

  • 后端:后端主要分为控制层(Controller)、服务层(Service)、数据持久/访问层(Dao)【由后端团队开发】

  • 前端:前端控制层,视图层【由前端团队开发】

    也就是伪造后端数据:使用json格式保存数据,不需要后端发送数据,前端工程能够独立运行

  • 前后端如何交互?使用提前定义好的API数据接口

  • 前后端工程相对独立,达到松耦合的目的

  • 前后端可以部署在不同的服务器上

但同时也就产生了一个问题:

  • 前后端的集成联调问题,也就是说前端开发人员和后端开发人员无法做到“及时协商”,可能前端只是增加一个简单的功能,但是却需要后端编写大量的代码

  • 唯一的解决方式就是“及时协商,尽早解决”,否则耽误项目对的工期和上线时间,甚至项目组成员被开除,造成内部矛盾被激化,从而导致问题集中式爆发,这不是我们想看的的结果。

具体解决方案:

  • 首先制定schema【计划提纲】,实时更新最新的API接口,降低前后端集成的风险
  • 早些年很多公司采用制定Word计划文档的方式,但这种方式效率低,同步性差
  • 进入前后端分离分离时代后:前端想要测试后端接口,可以使用postman测试工具;而后端提供接口,并且需要实时更新最新的消息及改动!
9.1.3 Swagger简单介绍 1.什么是Swagger?
  • Swagger号称世界上最流行的API框架;
  • 它支持RestFul风格的API文档的在线自动生成工具,可以实现API文档与API定义同步更新;
  • 可以直接运行,实现在线测试API接口;
  • 同时支持多种主流开发语言 (例如Java和PHP等)

Swagger官网的介绍如下:

Swagger是面向所有人的API 开发,使用 Swagger 开源和专业工具集为用户、团队和企业简化 API 开发。

Swagger官网地址:https://swagger.io/

2.如何在项目中使用Swagger?

在项目中使用Swagger时,需要用到SpringFox

  • Swagger2
  • Swagger UI
2-1 什么是SpringFox?

SpringFox是一个开源的API Doc的框架, 它的前身是swagger-springmvc,可以将我们的Controller中的方法以文档的形式展现。

2-2 SpringFox能做什么?
  • 使前后端更加解耦,保证API文档的实时同步:前后端的对接通常是API形式,而后端开发人员在开发过程中,提供的API和描述文档却是难以同步的,往往是开发代码完成了,但文档描述并不及时,甚至会遗忘这一环节,导致前端调用后端API时经常发生错误。SpringFox应运而生,使前端和后端有效分离,同时保证API与文档的实时更新;
  • 生成的接口文档直观可视:使用SpringFox不仅可以生成直观可视的接口文档,同时也帮助后端开发人员脱离了写接口文档的痛苦,还避免了不厌其烦的解说各个接口需要的参数和返回结果;
  • 支持在线测试:SpringFox可以支持在线测试,可以实时检查参数和返回值
9.2 SpringBoot集成Swagger 9.2.1 搭建项目基本环境 1.创建Spring Initialzr项目

2.设置项目基本信息

3.勾选项目相关资源依赖

4.选择项目存放位置

9.2.2 导入相关资源依赖 1.查看pom.xml文件基本信息
  • 由于创建项目时我们勾选了Spring Web资源依赖,所以在pom.xml配置文件中自动生成了springboot-webspringboot-test的相关资源依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.2
         
    
    com.kuang
    swagger
    0.0.1-SNAPSHOT
    swagger
    Demo project for Spring Boot
    
        1.8
    
    
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


2.添加springfox-swagger资源依赖
  • 由于springboot并没有为我们提供swagger的资源依赖,所以我们这里选择手动添加资源依赖,springboot整合springfox-swagger的资源依赖如下:

    io.springfox
    springfox-swagger2
    2.9.2

3.查看资源依赖是否导入成功

4.导入资源后的项目基本结构

9.2.3 项目页面访问测试 1.项目结构信息
  • src源文件下的com.kuang.swagger包下创建一个controller包,创建HelloController前端控制器类

2.编写HelloController控制器代码
package com.kuang.swagger.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



// 使用@RestController注解, 实现Controller接口, 使方法返回字符串
@RestController
public class HelloController {

    // 使用@RequestMapping注解, 设置请求映射路径, 请求方式为get类型
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }

}
3.访问页面测试结果

结果:访问成功,页面显示“hello”字符串!

9.2.4 解决无法swagger-ui.html页面问题

在后续访问swagger-ui.html页面时,遇到了无法访问页面的问题,解决方案如下:

1.Swagger版本降级
  • 降级到2.9.2版本

    io.springfox
    springfox-swagger2
    2.9.2

2.修改artifactId和使用@EnableOpenApi注解

artifactId修改为springfox-boot-starter, 并且在启动类前加上@EnableOpenApi注解

2-1 修改后的pom.xml配置文件

    io.springfox
    springfox-boot-starter
    3.0.0

2-2 修改SwaggerApplication启动类
package com.kuang.swagger;

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

@SpringBootApplication
// 使用Swagger2的3.0.0版本时, 需加上该注解
@EnableOpenApi
public class SwaggerApplication {

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

}
3.再次访问swagger-ui.html页面

注意:Swagger2的2.9.2版本需要访问swagger-ui.html页面,而3.0.0版本需要访问swagger-ui/index.html页面!

结果:访问swagger-ui页面成功!

9.3 SpringBoot配置Swagger 9.3.1 Swagger配置类的Docket类源码浅析 1.Docket类源码浅析
package springfox.documentation.spring.web.plugins;

// Docket类, 其实现了documentationPlugin(文档插件)接口
public class Docket implements documentationPlugin {
    
    // 使用公开的静态终极修饰的默认组名
    public static final String DEFAULT_GROUP_NAME = "default";
    private final documentationType documentationType;
    private final List securityContexts = new ArrayList();
    private final Map> responseMessages = new HashMap();
    private final Map> responses = new HashMap();
    private final List globalOperationParameters = new ArrayList();
    private final List> ruleBuilders = new ArrayList();
    private final Set ignorableParameterTypes = new HashSet();
    private final Set protocols = new HashSet();
    private final Set produces = new linkedHashSet();
    private final Set consumes = new linkedHashSet();
    private final Set additionalModels = new HashSet();
    private final Set tags = new HashSet();
    private final List servers = new ArrayList();
    private PathProvider pathProvider;
    private List securitySchemes;
    private Comparator apiListingReferenceOrdering;
    private Comparator apiDescriptionOrdering;
    private Comparator operationOrdering;
    private ApiInfo apiInfo;
    private String groupName;
    private boolean enabled;
    private GenericTypeNamingStrategy genericsNamingStrategy;
    private boolean applyDefaultResponseMessages;
    private String host;
    private Optional pathMapping;
    private ApiSelector apiSelector;
    private boolean enableUrlTemplating;
    private final List vendorExtensions;
    private final List globalRequestParameters;
    
    
    public Docket(documentationType documentationType) {
        // 设置API信息为默认值
        this.apiInfo = ApiInfo.DEFAULT;
        // 设置默认组名为default
        this.groupName = "default";
        // 设置是否生效, 设置为true(表示生效)
        this.enabled = true;
	    // 设置生成名字策略, 其值为创建一个默认生成类型策略类		
        this.genericsNamingStrategy = new DefaultGenericTypeNamingStrategy();
        // 设置应用默认响应信息
        this.applyDefaultResponseMessages = true;
        // 设置主机名, 默认为空
        this.host = "";
        // 设置映射路径
        this.pathMapping = Optional.empty();
        // 设置api选择器
        this.apiSelector = ApiSelector.DEFAULT;
        // 设置是否开启url模板
        this.enableUrlTemplating = false;
        // 设置扩展器
        this.vendorExtensions = new ArrayList();
        // 设置全局请求参数
        this.globalRequestParameters = new ArrayList();
        // 设置文档类型
        this.documentationType = documentationType;
    }
    
    // ...(省略后面部分代码)...

}
2.documentationType类源码浅析
package springfox.documentation.spi;

// 文档类型子类, 实现简单插件元数据父类
public class documentationType extends SimplePluginmetadata {
    // 文档类型SWAGGER_12, 设置文档类型构造函数的参数为swagger和1.2
    public static final documentationType SWAGGER_12 = new documentationType("swagger", "1.2");
    // 文档类型SWAGGER_2, 设置文档类型构造函数的参数为swagger和2.0
    public static final documentationType SWAGGER_2 = new documentationType("swagger", "2.0");
    // 文档类型OSA_30, 设置文档类型构造函数的参数为openApi和3.0
    public static final documentationType OAS_30 = new documentationType("openApi", "3.0");
    
    @Deprecated
    // 文档类型为SPRING_WEB, 设置文档类型构造函数的参数为spring-web和5.2
    public static final documentationType SPRING_WEB = new documentationType("spring-web", "5.2");
    // 媒介类型
    private final MediaType mediaType;
    
    // 文档类型有参构造函数1(三个参数)
    public documentationType(String name, String version, MediaType mediaType) {
        super(name, version);
        this.mediaType = mediaType;
    }
    
    // 档类型有参构造函数2(两个参数)
    public documentationType(String name, String version) {
        this(name, version, MediaType.APPLICATION_JSON);
    }
    
    // 获取媒介类型
    public MediaType getMediaType() {
        return this.mediaType;
    }
    // equals方法
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        } else if (!(o instanceof documentationType)) {
            return false;
        } else if (!super.equals(o)) {
            return false;
        } else {
            documentationType that = (documentationType)o;
            return super.equals(that) && this.mediaType.equals(that.mediaType);
        }
    }
    
    // hashCode方法
    public int hashCode() {
        int result = super.hashCode();
        result = 31 * result + this.mediaType.hashCode();
        return result;
    }
}
3.ApiInfo类源码浅析
package springfox.documentation.service;

// ApiInfo类
public class ApiInfo {
    
    // 默认的合并多个字符串
    public static final Contact DEFAULT_ConTACT = new Contact("", "", "");
    public static final ApiInfo DEFAULT; // Api的默认信息
    private final String version; // 版本
    private final String title; // 标题
    private final String description; // 描述
    private final String termsOfServiceUrl; // 服务条件url
    private final String license; // 许可证
    private final String licenseUrl; // 许可证url
    private final Contact contact; // 域名简介
    private final List vendorExtensions; // 扩展

    
    @Deprecated // 使用@Deprecated注解, 表示已弃用
    public ApiInfo(String title, String description, String version, String termsOfServiceUrl, String contactName, String license, String licenseUrl) {
        this(title, description, version, termsOfServiceUrl, new Contact(contactName, "", ""), license, licenseUrl, new ArrayList());
    }

    // Api信息的有参构造函数
    public ApiInfo(String title, String description, String version, String termsOfServiceUrl, Contact contact, String license, String licenseUrl, Collection vendorExtensions) {
        this.title = title;
        this.description = description;
        this.version = version;
        this.termsOfServiceUrl = termsOfServiceUrl;
        this.contact = contact;
        this.license = license;
        this.licenseUrl = licenseUrl;
        this.vendorExtensions = new ArrayList(vendorExtensions);
    }
 
    
    // 获取标题
    public String getTitle() {
        return this.title;
    }

    // 获取描述
    public String getDescription() {
        return this.description;
    }

    // 获取服务条件url
    public String getTermsOfServiceUrl() {
        return this.termsOfServiceUrl;
    }

    // 获取域名
    public Contact getContact() {
        return this.contact;
    }

    // 获取许可证
    public String getLicense() {
        return this.license;
    }

    // 获取许可证url
    public String getLicenseUrl() {
        return this.licenseUrl;
    }

    // 获取版本
    public String getVersion() {
        return this.version;
    }

    // 获取扩展
    public List getVendorExtensions() {
        return this.vendorExtensions;
    }

    // 静态代码块
    static {
        // api信息的默认值为创建一个ApiInfo类, 设置其构造函数的主要参数信息
        DEFAULT = new ApiInfo("Api documentation", "Api documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());
    }
    
}
9.3.2 编写Swagger配置类信息 1.Swagger配置类实现代码
package com.kuang.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;

import java.util.ArrayList;



// 将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo());
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }

}
2.访问swagger-ui页面测试
  • 访问默认的swagger-ui页面,查看文档主要信息:

    可以发现,该API文档主要包括两个前端控制器,分别是基本的错误控制器hello控制器

  • 访问基本的错误前端控制器接口,查看相关方法信息:

经过观察可以发现,该接口的方法主要包括了RestFul风格的各类请求方式:

首先是常见的四种请求方式:POST(对应添加操作)、DELETE(对应删除操作)、PUT(对应修改操作)、GET(对应查询操作),也就是常用的增删改查操作;还有三个不太常用的:HEAD(获取资源的元数据)、PATCH(对应修改操作,只能提供资源的部分属性)、OPTIONS(对应查询操作,获取指定的属性信息)

  • 访问基本的hello前端控制器接口,查看相关方法信息:

    主要方法类型跟基本错误控制器相同,这里就不再进行说明了

知识扩展:

那你是否想过:为什么我们可以在端口号后面加上swaggee-ui/index.html,就可以访问到Swagger的API文档页面了呢?

  • 查看项目左侧的外部库,找到springfox-swagger-ui,点击MATA-INF下的resources包,你会发现有一个index.html页面,这就是我们所访问的那个Swagger的API文档页面!

9.4 Swagger配置扫描接口 9.4.1 查看RequestHandlerSelectors类源码
package springfox.documentation.builders;

// RequestHandlerSelectors(请求处理器选择器)类
public class RequestHandlerSelectors {
    // 请求处理器选择器类的无参构造函数
    private RequestHandlerSelectors() {
        //抛出不支持操作异常
        throw new UnsupportedOperationException();
    }
    
    // 扫描任何包路径
    public static Predicate any() {
        //使用lambda表达式写法, 其主要形式为()->{} 方法作为参数
        return (each) -> {
            return true;
        };
    }
    
    // 不扫描任何包路径
    public static Predicate none() {
        return (each) -> {
            return false;
        };
    }
    
    // 扫描方法的注解(参数为注解的反射对象)
    public static Predicate withMethodAnnotation(final Class annotation) {
        return (input) -> {
            return input.isAnnotatedWith(annotation);
        };
    }
    
    // 扫描类的注解
    public static Predicate withClassAnnotation(final Class annotation) {
        return (input) -> {
            return (Boolean)declaringClass(input).map(annotationPresent(annotation)).orElse(false);
        };
    }

    // 扫描预先的注解
    private static Function, Boolean> annotationPresent(final Class annotation) {
        return (input) -> {
            return input.isAnnotationPresent(annotation);
        };
    }

    // 控制器包
    private static Function, Boolean> handlerPackage(final String basePackage) {
        return (input) -> {
            return ClassUtils.getPackageName(input).startsWith(basePackage);
        };
    }

    // 基本包
    public static Predicate basePackage(String basePackage) {
        return (input) -> {
            return (Boolean)declaringClass(input).map(handlerPackage(basePackage)).orElse(true);
        };
    }

    // 声明类
    private static Optional> declaringClass(RequestHandler input) {
        return Optional.ofNullable(input.declaringClass());
    }
    
}
9.4.2 编写Swagger配置类和页面访问测试 1.只设置扫描指定的基本包路径
  • 编写Swagger配置类实现代码
package com.kuang.swagger.config;



// 将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                // 设置api信息, 传入参数为RequestHandlerSelectors(请求控制器选择器), 配置basePackage信息(扫描指定的基本包路径)
                .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
                .build();
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }

}
  • 访问swagger-ui页面API文档信息

2.设置扫描指定包路径和过滤路径
  • 编写Swagger配置类实现代码
package com.kuang.swagger.config;



// 将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                // 设置api信息, 传入参数为RequestHandlerSelectors(请求控制器选择器), 配置basePackage信息(扫描指定的基本包路径)
                .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
            // 设置过滤的路径(使用ant进行匹配, 过滤掉不以"/kuang

// 将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                //扫描所有的包路径
                .apis(RequestHandlerSelectors.any())
                // 构建(设计思想为工厂模式)
                .build();
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }

}
  • 设置不扫描任何包路径
package com.kuang.swagger.config;



// 将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                // 不扫描任何包路径
                .apis(RequestHandlerSelectors.none())
                // 构建(设计思想为工厂模式)
                .build();
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }
    
}
  • 设置扫描类上的注解
package com.kuang.swagger.config;



//将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                // 扫描类上的注解(其参数为注解的反射对象)
              .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                // 构建(设计思想为工厂模式)
                .build();
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }
    
}
  • 设置扫描方法上的注解
package com.kuang.swagger.config;



//将SwaggerConfig类注册为配置类
@Configuration
// 开启Swagger2的支持
@EnableSwagger2
public class SwaggerConfig {

    // 使用@Bean注解, 将docket注册为IOC容器中的Bean节点
    @Bean
    public Docket docket() {
        // 返回值为新建一个Docket类, 其构造函数的参数为documentationType.SWAGGER_2(表示文档类型为Swagger2)
        return new Docket(documentationType.SWAGGER_2)
                // 将apiInfo设置为自定义的
                .apiInfo(myApiInfo())
                // Api的选择器
                .select()
                // 扫描方法上的注解
                .apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class))
                // 构建(设计思想为工厂模式)
                .build();
    }

    // 配置Swagger信息apiInfo
    private ApiInfo myApiInfo() {

        // 作者的名字, url和邮箱地址
        Contact contact = new Contact("狂奔de蜗牛rz","https://mp.csdn.net/?spm=1000.2115.3001.4503","1441505359@qq.com");
        // 返回值为创建一个新的ApiInfo类, 设置基本信息
        return new ApiInfo("自定义SwaggerApi文档",
                            "乘风破浪会有时, 直挂云帆济沧海",
                            "V1.0",
                            "http://localhost:8080/hello",
                             contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList<>());
    }
    
}

好了,今天的有关 SpringBoot基础学习之整合Swagger框架(上篇) 的学习就到此结束啦,欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连,我们下期见,拜拜啦!


参考博客链接:https://zhuanlan.zhihu.com/p/40819897 (SpringFox 初体验)


参考视频链接:https://www.bilibili.com/video/BV1PE411i7CV(【狂神说Java】SpringBoot最新教程IDEA版通俗易懂)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353280.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号