SpringBoot中集成Swagger

简介: 最近在做一个demo,出一些测试接口,就想到了集成swagger。文章对swagger2和swagger3的集成记录

一、集成Swagger2

1. pom引用

<properties><java.version>1.8</java.version><swagger.version>2.9.2</swagger.version><fastjson.version>1.2.75</fastjson.version><hutool.version>5.7.16</hutool.version></properties><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

说明:

  • 项目中使用了Validated,即hibernate-validator
  • swagger使用了2.9.2版本
  1. springfox-swagger2
  2. springfox-swagger-ui
  • fastjson不再赘述
  • hutool-all java工具类库https://www.hutool.cn/
  • lombok在编译期生成get、set、toString等等,减少构建代码

2. Swagger2配置类

packagecom.example.config;
importorg.springframework.context.annotation.Configuration;
importspringfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration@EnableSwagger2publicclassSwaggerConfig {
}

3. 访问Swagger2页面

访问地址:http://localhost:9090/swagger-ui.html

image.png

4. 在集成的过程中出现的问题

一开始使用的SpringBoot版本是2.7.0

在项目启动时,出现错误

image.png

在之前集成的时候,使用的SpringBoot版本是2.5.6,就没有遇到上面的错误

后来去网上百度时,出现这个问题的原因是

SpringBoot 2.6.0中将SpringMVC的默认路径匹配策略从AntPathMatcher更改为PathPatternParser,导致出错。

解决办法是:切回原先的AntPathMatcher

采用降低SpringBoot的版本或者更改路径匹配策略,都可吧。后者对于以后的使用上未知。

除去以上两种方式,还有未验证的一种方式

添加对guava的依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>25.1-jre</version></dependency>

二、集成Swagger3

1. pom引用

<properties><java.version>1.8</java.version><springfox.version>3.0.0</springfox.version><fastjson.version>1.2.75</fastjson.version><hutool.version>5.7.16</hutool.version></properties><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>${springfox.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency>

与上面Swagger2不同之处在于,由两个引用替换成了一个springfox-boot-starter引用

2. Swagger3配置类

在Swagger3中如果使用默认的配置,是不需要Configuration的配置类

在Springfox的介绍中,移除了@EnableSwagger2 注解

image.png

不需要配置类,直接启动项目即可

3. 访问Swagger3页面

访问地址:http://localhost:8080/swagger-ui/

image.png

在界面上与Swagger2稍微有点不同

4. 在集成的过程中出现的问题

同上,也出现过类加载的问题

可以使用前两种方案解决

三、Swagger使用

关于使用,不再区分swagger2或者swagger3。

估计使用上大面上是一致的

1. 配置文档信息

1.1 在swagger2中
packagecom.example.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importspringfox.documentation.service.ApiInfo;
importspringfox.documentation.service.Contact;
importspringfox.documentation.spi.DocumentationType;
importspringfox.documentation.spring.web.plugins.Docket;
importspringfox.documentation.swagger2.annotations.EnableSwagger2;
importjava.util.concurrent.CopyOnWriteArrayList;
@Configuration@EnableSwagger2publicclassSwaggerConfig {
@BeanpublicDocketdocket() {
returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }
privateApiInfoapiInfo() {
Contactcontact=newContact("阿里云", "https://www.aliyun.com/", "");
returnnewApiInfo(
//标题"文档标题",
//描述"文档描述",
//版本"文档版本1.0.0",
//组织连接"https://www.aliyun.com/",
//联系人信息contact,
//许可证"Apache 2.0 许可",
//许可连接"http://www.apache.org/licenses/LICENSE-2.0",
//扩展newCopyOnWriteArrayList<>());
    }
}
1.2 在swagger3中
packagecom.example.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importspringfox.documentation.service.ApiInfo;
importspringfox.documentation.service.Contact;
importspringfox.documentation.spi.DocumentationType;
importspringfox.documentation.spring.web.plugins.Docket;
importjava.util.concurrent.CopyOnWriteArrayList;
@ConfigurationpublicclassSwaggerConfig {
@BeanpublicDocketdocket() {
returnnewDocket(DocumentationType.OAS_30).apiInfo(apiInfo());
    }
privateApiInfoapiInfo() {
Contactcontact=newContact("阿里云", "https://www.aliyun.com/", "");
returnnewApiInfo(
//标题"文档标题",
//描述"文档描述",
//版本"文档版本1.0.0",
//组织连接"https://www.aliyun.com/",
//联系人信息contact,
//许可证"Apache 2.0 许可",
//许可连接"http://www.apache.org/licenses/LICENSE-2.0",
//扩展newCopyOnWriteArrayList<>());
    }
}
1.3 页面展示

image.png

image.png

2. 配置接口扫描

@BeanpublicDocketdocket() {
// DocumentationType版本的区别returnnewDocket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example"))
            .build();
}

image.png

image.png

在select()和build()之间加入才生效

image.png

apis()的参数

  • any() 配置扫描所有
  • none() 不扫描接口
  • withMethodAnnotation() 配置扫描指定的方法注解
  • withClassAnnotation() 配置扫描指定的类注解
  • basePackage() 配置扫描指定的包路径

3. 配置接口扫描的path

@BeanpublicDocketdocket() {
// DocumentationType版本的区别returnnewDocket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example"))
            .paths(PathSelectors.any())
            .build();
}

image.png

paths()的参数

  • any() 任何请求都扫描
  • none() 任何请求都不扫描
  • regex() 符合正则表达式的
  • ant() 符合ant的路径

4. 配置Api的分组

在没有配置分组时,默认是default。可以通过groupName()方法设置分组

@BeanpublicDocketdocket() {
returndocketGroup("");
}
@BeanpublicDocketdocket1() {
returndocketGroup("group1");
}
@BeanpublicDocketdocket2() {
returndocketGroup("group2");
}
privateDocketdocketGroup(StringgroupName) {
Docketdocket=newDocket(DocumentationType.OAS_30);
if (StrUtil.isNotBlank(groupName)) {
docket.groupName(groupName);
    }
docket.apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example"))
            .paths(PathSelectors.any())
            .build();
returndocket;
}

指定三个分组,分别:default、group1、group2。

image.png

5. 配置是否开启Swagger

可以通过enable()方法来配置是否开启swagger

/*** Hook to externally control auto initialization of this swagger plugin instance.* Typically used if defer initialization.** @param externallyConfiguredFlag - true to turn it on, false to turn it off* @return this Docket*/publicDocketenable(booleanexternallyConfiguredFlag) {
this.enabled=externallyConfiguredFlag;
returnthis;
}

配置default、dev、test环境开启Swagger

@BeanpublicDocketdocket(Environmentenv) {
returndocketGroup("")
            .enable(env.acceptsProfiles(Profiles.of("default", "dev", "test")));
}

配置的参数即spring.profiles.active指定的值,不指定,默认值为default

6. Controller接口创建

packagecom.example.controller;
importcom.example.entity.Student;
importio.swagger.annotations.Api;
importio.swagger.annotations.ApiOperation;
importlombok.AllArgsConstructor;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.validation.annotation.Validated;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjavax.validation.Valid;
@Slf4j@Valid@Validated@RestController@AllArgsConstructor@RequestMapping("/api")
@Api(value="3.0版本api请求", tags="3.0版本api请求")
publicclassApiController {
@GetMapping("/test")
@ApiOperation(value="3.0测试接口", notes="该接口的描述")
publicStringtest() {
return"test";
    }
@GetMapping("/student")
@ApiOperation(value="学生类接口", notes="获取一个学生对象")
publicStudentstudent() {
Studentstudent=newStudent();
student.setName("张三");
student.setAge(18);
returnstudent;
    }
}

Student学生实体类

packagecom.example.entity;
importio.swagger.annotations.ApiModel;
importio.swagger.annotations.ApiModelProperty;
importlombok.Data;
@Data@ApiModel(value="学生类实体")
publicclassStudent {
@ApiModelProperty("姓名")
privateStringname;
@ApiModelProperty("年龄")
privateIntegerage;
}

image.png

7. Swagger的不同ui风格

7.1 默认ui

访问地址:http://localhost:8080/swagger-ui/

<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>${springfox.version}</version></dependency>

image.png

7.2 bootstrap ui

访问地址:http://localhost:8080/doc.html

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency>

image.png

后来被knife4j代替

image.png

image.png

7.3 Layui ui

访问地址:http://localhost:8080/docs.html

<dependency><groupId>com.github.caspar-chen</groupId><artifactId>swagger-ui-layer</artifactId><version>1.1.3</version></dependency>

image.png

这个基于Layui的好像不能切换分组,没找到切换分组的地方.

更不幸的是,这个项目已经停止维护了

7.4 knife4j

https://doc.xiaominfo.com/knife4j/documentation/

image.png

集成的选择比较多,可以自行选择。

此外,衍生出来的功能也比较多,可以尝试去探索。

更可以参考网站文档去使用:https://doc.xiaominfo.com/knife4j/documentation/

四、关于Swagger2和Swagger3

https://github.com/springfox/springfox

image.png

image.png

目录
相关文章
|
8月前
|
JSON Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
本文详细介绍了Swagger2的使用方法,包括在Spring Boot项目中的配置与应用。重点讲解了Swagger2中常用的注解,如实体类上的`@ApiModel`和`@ApiModelProperty`,Controller类上的`@Api`、`@ApiOperation`以及参数上的`@ApiParam`等。通过示例代码展示了如何为实体类和接口添加注解,并在页面上生成在线接口文档,实现接口测试。最后总结了Swagger的优势及其在项目开发中的重要性,提供了课程源代码下载链接供学习参考。
487 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
|
8月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
893 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
8月前
|
Java Maven 微服务
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
265 0
|
8月前
|
前端开发 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档—— Swagger 简介
第6课介绍了在Spring Boot中集成Swagger2以展示在线接口文档的方法。随着前后端分离架构的发展,API文档成为连接前端与后端开发的重要纽带。然而,代码更新频繁导致文档难以同步维护,Swagger2解决了这一问题。通过Swagger,在线API文档不仅方便了接口调用方查看和测试,还支持开发者实时测试接口数据。本文使用Swagger 2.2.2版本,讲解如何在Spring Boot项目中导入并配置Swagger2工具,从而高效管理接口文档。
262 0
|
数据可视化 Java API
Spring Boot与Swagger的集成
Spring Boot与Swagger的集成
|
Java API 开发者
在Spring Boot中集成Swagger API文档
在Spring Boot中集成Swagger API文档
|
12月前
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
800 4
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
435 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
1940 1
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
863 2