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

目录
相关文章
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
90 1
|
2月前
|
开发工具 Python
django之drf集成swagger
django之drf集成swagger
|
2月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
2月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
3月前
|
Java API Spring
springboot集成swagger
这篇文章介绍了如何在Spring Boot项目中集成Swagger 2.10.0来生成API文档,包括添加依赖、编写配置类、创建接口文档,并使用Knife4j美化Swagger界面。
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
290 6
|
4月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
368 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
318 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
168 2