肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > SpringBoot基础学习之整合Swagger框架(上篇)

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

时间:2019-04-19 21:03:56

相关推荐

前言

小伙伴们,大家好,我是狂奔の蜗牛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 什么是前后端分离?

到了,“前后端分离”这个名词想必大家都不陌生了,因为目前市场上的很多项目都是前端采用 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:

Swagger2Swagger 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-web和springboot-test的相关资源依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /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.5.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.kuang</groupId><artifactId>swagger</artifactId><version>0.0.1-SNAPSHOT</version><name>swagger</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- springboot-web的资源依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- springboot-test的资源依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.添加springfox-swagger资源依赖

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

<!-- springfox-swagger2的资源依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency>

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;/*** @ClassName HelloController* @Description Hello前端控制器* @Author 狂奔de蜗牛rz* @Date /10/1*/// 使用@RestController注解, 实现Controller接口, 使方法返回字符串@RestControllerpublic 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版本

<!-- springfox-swagger2的资源依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency>

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

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

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

<!-- springfox-swagger2的资源依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

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版本时, 需加上该注解@EnableOpenApipublic 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<SecurityContext> securityContexts = new ArrayList();private final Map<RequestMethod, List<ResponseMessage>> responseMessages = new HashMap();private final Map<HttpMethod, List<Response>> responses = new HashMap();private final List<Parameter> globalOperationParameters = new ArrayList();private final List<Function<TypeResolver, AlternateTypeRule>> ruleBuilders = new ArrayList();private final Set<Class> ignorableParameterTypes = new HashSet();private final Set<String> protocols = new HashSet();private final Set<String> produces = new LinkedHashSet();private final Set<String> consumes = new LinkedHashSet();private final Set<ResolvedType> additionalModels = new HashSet();private final Set<Tag> tags = new HashSet();private final List<Server> servers = new ArrayList();private PathProvider pathProvider;private List<SecurityScheme> securitySchemes;private Comparator<ApiListingReference> apiListingReferenceOrdering;private Comparator<ApiDescription> apiDescriptionOrdering;private Comparator<Operation> operationOrdering;private ApiInfo apiInfo;private String groupName;private boolean enabled;private GenericTypeNamingStrategy genericsNamingStrategy;private boolean applyDefaultResponseMessages;private String host;private Optional<String> pathMapping;private ApiSelector apiSelector;private boolean enableUrlTemplating;private final List<VendorExtension> vendorExtensions;private final List<RequestParameter> globalRequestParameters;/** * Docket的有参构造函数* @param documentationType 文档类型*/public Docket(DocumentationType documentationType) {// 设置API信息为默认值this.apiInfo = ApiInfo.DEFAULT;// 设置默认组名为defaultthis.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.2public static final DocumentationType SWAGGER_12 = new DocumentationType("swagger", "1.2");// 文档类型SWAGGER_2, 设置文档类型构造函数的参数为swagger和2.0public static final DocumentationType SWAGGER_2 = new DocumentationType("swagger", "2.0");// 文档类型OSA_30, 设置文档类型构造函数的参数为openApi和3.0public static final DocumentationType OAS_30 = new DocumentationType("openApi", "3.0");/** @deprecated */@Deprecated// 文档类型为SPRING_WEB, 设置文档类型构造函数的参数为spring-web和5.2public 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; // 服务条件urlprivate final String license; // 许可证private final String licenseUrl; // 许可证urlprivate final Contact contact; // 域名简介private final List<VendorExtension> 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<VendorExtension> 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);}/*** 生成的get方法*/// 获取标题public String getTitle() {return this.title;}// 获取描述public String getDescription() {return this.description;}// 获取服务条件urlpublic String getTermsOfServiceUrl() {return this.termsOfServiceUrl;}// 获取域名public Contact getContact() {return this.contact;}// 获取许可证public String getLicense() {return this.license;}// 获取许可证urlpublic String getLicenseUrl() {return this.licenseUrl;}// 获取版本public String getVersion() {return this.version;}// 获取扩展public List<VendorExtension> getVendorExtensions() {return this.vendorExtensions;}// 静态代码块static {// api信息的默认值为创建一个ApiInfo类, 设置其构造函数的主要参数信息DEFAULT = new ApiInfo("Api Documentation", "Api Documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "/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;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*/// 将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic Docket docket() {// 返回值为新建一个Docket类, 其构造函数的参数为DocumentationType.SWAGGER_2(表示文档类型为Swagger2)return new Docket(DocumentationType.SWAGGER_2)// 将apiInfo设置为自定义的.apiInfo(myApiInfo());}// 配置Swagger信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/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<RequestHandler> any() {//使用lambda表达式写法, 其主要形式为()->{} 方法作为参数return (each) -> {return true;};}// 不扫描任何包路径public static Predicate<RequestHandler> none() {return (each) -> {return false;};}// 扫描方法的注解(参数为注解的反射对象)public static Predicate<RequestHandler> withMethodAnnotation(final Class<? extends Annotation> annotation) {return (input) -> {return input.isAnnotatedWith(annotation);};}// 扫描类的注解public static Predicate<RequestHandler> withClassAnnotation(final Class<? extends Annotation> annotation) {return (input) -> {return (Boolean)declaringClass(input).map(annotationPresent(annotation)).orElse(false);};}// 扫描预先的注解private static Function<Class<?>, Boolean> annotationPresent(final Class<? extends Annotation> annotation) {return (input) -> {return input.isAnnotationPresent(annotation);};}// 控制器包private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {return (input) -> {return ClassUtils.getPackageName(input).startsWith(basePackage);};}// 基本包public static Predicate<RequestHandler> basePackage(String basePackage) {return (input) -> {return (Boolean)declaringClass(input).map(handlerPackage(basePackage)).orElse(true);};}// 声明类private static Optional<Class<?>> declaringClass(RequestHandler input) {return Optional.ofNullable(input.declaringClass());}}

9.4.2 编写Swagger配置类和页面访问测试

1.只设置扫描指定的基本包路径

编写Swagger配置类实现代码

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*/// 将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic 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信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

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

2.设置扫描指定包路径和过滤路径

编写Swagger配置类实现代码

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*/// 将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic 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/**"开头的请求路径).paths(PathSelectors.ant("/kuang/**"))// 构建(设计思想为工厂模式).build();}// 配置Swagger信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

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

3.其他的设置扫描情况

设置扫描所有的包路径

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*/// 将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic Docket docket() {// 返回值为新建一个Docket类, 其构造函数的参数为DocumentationType.SWAGGER_2(表示文档类型为Swagger2)return new Docket(DocumentationType.SWAGGER_2)// 将apiInfo设置为自定义的.apiInfo(myApiInfo())// Api的选择器.select()//扫描所有的包路径.apis(RequestHandlerSelectors.any())// 构建(设计思想为工厂模式).build();}// 配置Swagger信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

设置不扫描任何包路径

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*/// 将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic Docket docket() {// 返回值为新建一个Docket类, 其构造函数的参数为DocumentationType.SWAGGER_2(表示文档类型为Swagger2)return new Docket(DocumentationType.SWAGGER_2)// 将apiInfo设置为自定义的.apiInfo(myApiInfo())// Api的选择器.select()// 不扫描任何包路径.apis(RequestHandlerSelectors.none())// 构建(设计思想为工厂模式).build();}// 配置Swagger信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

设置扫描类上的注解

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*///将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic 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信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

设置扫描方法上的注解

package com.kuang.swagger.config;/*** @ClassName SwaggerConfig* @Description Swagger配置类* @Author 狂奔de蜗牛rz* @Date /10/1*///将SwaggerConfig类注册为配置类@Configuration// 开启Swagger2的支持@EnableSwagger2public class SwaggerConfig {// 使用@Bean注解, 将docket注册为IOC容器中的Bean节点@Beanpublic 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信息apiInfoprivate ApiInfo myApiInfo() {// 作者的名字, url和邮箱地址Contact contact = new Contact("狂奔de蜗牛rz","/?spm=1000.2115.3001.4503","1441505359@");// 返回值为创建一个新的ApiInfo类, 设置基本信息return new ApiInfo("自定义SwaggerApi文档","乘风破浪会有时, 直挂云帆济沧海","V1.0","http://localhost:8080/hello",contact,"Apache 2.0","/licenses/LICENSE-2.0",new ArrayList<>());}}

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

参考博客链接:/p/40819897 (SpringFox 初体验)

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

如果觉得《SpringBoot基础学习之整合Swagger框架(上篇)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。