前言:
小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。
这个SpringBoot基础学习系列用来记录我学习SpringBoot框架基础知识的全过程 (这个系列是参照B站狂神的SpringBoot最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)
之后我将会尽量以一天一更的速度更新这个系列,还没有学习SpringBoot的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧!加油吧!少年们!
由于篇幅较长,所以这里我将其分为了上下两篇博客,上篇主要了解Swagger的概念,学习SpringBoot整合Swagger,以及配置Swagger和扫描接口;下篇主要学习Swagger配置是否启动 和 设置Swagger文档注释,以及Swagger在线测试等。
今天我们来到了SpringBoot基础学习的第九站:整合Swagger框架(上篇)。废话不多说,让我们开始今天的学习内容吧!
学习目标:
在介绍Swagger之前,先来了解一下什么是前后端分离?因为Swagger的出现就是为了方便管理前后端分离项目
到2021年了,“前后端分离”这个名词想必大家都不陌生了,因为目前市场上的很多项目都是前端采用 Vue框架,后端采用SpringBoot框架的设计方案。
这里我简单说一下我对前后端分离的理解,前后端分离从字面上看也就是说前端和后端分离开了,那为什么要分离开嘞?
下面我就从分工合作、工作效率还有代码管理三个方面解释一下:
分工合作方面:大家还记得在初学JavaWeb时,被Servlet和JSP支配的恐惧吗?我们很多时候不得不在前端的JSP页面里写一堆Java后端代码;这就意味着,设计过程必须先由后端程序员编写后端的Java代码,然后前端程序员编写前端JSP代码,如果前端想要渲染数据,还要让后端程序员在前端JSP页面写后端代码,先不说这个工作流程麻不麻烦,如果前端程序员想要修改一些功能,还要求着后端程序员来改,我前端程序员还得看你后端程序员脸色是吧,大家都是要面子的是吧,改来改去谁也嫌麻烦,万一后端和前端干起来了,项目经理还得花时间劝架,大伙不仅可能面临加班,而且项目可以又要延期上线!
工作效率方面:在JSP时代,前后端想同时进行是不太可能的事情,往往都是先写Java后端代码,然后再写JSP页面中的前端代码,然后再写JSP页面里的后端代码,这样一来一回的,同时进行是不可能的事情。但如果前后端分离之后,在项目的整体设计方案敲定后,前端和后端只需要提前商量好,大家调用事先设计好的接口,然后接收和发送对应的数据进行处理就完事了,这样前端后端同时进行,不仅有了更多的时间去做前期的需求分析和详细设计,也能有充裕的时间进行系统的测试,保证项目的整体质量,甚至能够提前上线!
代码管理方面:在前端的JSP页面是写一堆后端Java代码,不仅后端程序员觉得别扭,前端程序员也觉得别扭 (前端程序员如果懂都后端还行,不懂后端代码,估计是一脸懵逼吧),而且这也违反了软件设计中的“高内聚,低耦合”原则,前端后端代码糅杂在一起,这耦合度确实挺高的,后期维护起来,那得后端程序员得和前端程序员一起上,不仅浪费时间,还浪费人力。
接下来跟大家聊一下后端时代和前后端分离时代的一些主要区别:
后端时代:
刚开始前端只用管理静态页面,也就是html页面,然后交给后端进行处理;后来出现了模板引擎,也就是JSP (Java Server Page,即Java服务器页面),这时候后端是主力 (哈哈,也就是说,那个时候后端程序员要比前端程序员工资高)
前后端分离时代:
后端:后端主要分为控制层(Controller)、服务层(Service)、数据持久/访问层(Dao)【由后端团队开发】
前端:前端控制层,视图层【由前端团队开发】
也就是伪造后端数据:使用json格式保存数据,不需要后端发送数据,前端工程能够独立运行
前后端如何交互?使用提前定义好的API数据接口
前后端工程相对独立,达到松耦合的目的
前后端可以部署在不同的服务器上
但同时也就产生了一个问题:
前后端的集成联调问题,也就是说前端开发人员和后端开发人员无法做到“及时协商”,可能前端只是增加一个简单的功能,但是却需要后端编写大量的代码
唯一的解决方式就是“及时协商,尽早解决”,否则耽误项目对的工期和上线时间,甚至项目组成员被开除,造成内部矛盾被激化,从而导致问题集中式爆发,这不是我们想看的的结果。
具体解决方案:
Swagger官网的介绍如下:
Swagger是面向所有人的API 开发,使用 Swagger 开源和专业工具集为用户、团队和企业简化 API 开发。
Swagger官网地址:https://swagger.io/
在项目中使用Swagger时,需要用到SpringFox:
SpringFox是一个开源的API Doc的框架, 它的前身是swagger-springmvc,可以将我们的Controller中的方法以文档的形式展现。
<?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 https://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.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>
<!-- springfox-swagger2的资源依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
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 2021/10/1 */ // 使用@RestController注解, 实现Controller接口, 使方法返回字符串 @RestController public class HelloController { // 使用@RequestMapping注解, 设置请求映射路径, 请求方式为get类型 @RequestMapping("/hello") public String hello() { return "hello"; } }
结果:访问成功,页面显示“hello”字符串!
在后续访问swagger-ui.html页面时,遇到了无法访问页面的问题,解决方案如下:
<!-- springfox-swagger2的资源依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
将artifactId修改为springfox-boot-starter, 并且在启动类前加上@EnableOpenApi注解
<!-- springfox-swagger2的资源依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
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); } }
注意:Swagger2的2.9.2版本需要访问swagger-ui.html页面,而3.0.0版本需要访问swagger-ui/index.html页面!
结果:访问swagger-ui页面成功!
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; // 设置默认组名为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; } // ...(省略后面部分代码)... }
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 */ @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; } }
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<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; } // 获取服务条件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<VendorExtension> 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()); } }
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 2021/10/1 */ // 将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<>()); } }
访问默认的swagger-ui页面,查看文档主要信息:
可以发现,该API文档主要包括两个前端控制器,分别是基本的错误控制器和hello控制器
经过观察可以发现,该接口的方法主要包括了RestFul风格的各类请求方式:
首先是常见的四种请求方式:POST(对应添加操作)、DELETE(对应删除操作)、PUT(对应修改操作)、GET(对应查询操作),也就是常用的增删改查操作;还有三个不太常用的:HEAD(获取资源的元数据)、PATCH(对应修改操作,只能提供资源的部分属性)、OPTIONS(对应查询操作,获取指定的属性信息)
访问基本的hello前端控制器接口,查看相关方法信息:
主要方法类型跟基本错误控制器相同,这里就不再进行说明了
知识扩展:
那你是否想过:为什么我们可以在端口号后面加上swaggee-ui/index.html,就可以访问到Swagger的API文档页面了呢?
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()); } }
package com.kuang.swagger.config; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ // 将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<>()); } }
package com.kuang.swagger.config; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ // 将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/**"开头的请求路径) .paths(PathSelectors.ant("/kuang/**")) // 构建(设计思想为工厂模式) .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; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ // 将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; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ // 将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; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ //将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; /** * @ClassName SwaggerConfig * @Description Swagger配置类 * @Author 狂奔de蜗牛rz * @Date 2021/10/1 */ //将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版通俗易懂)