Spring Boot集成Swagger2
目录
警告
本文最后更新于 2023-03-05,文中内容可能已过时,请谨慎使用。
参考视频
环境介绍
Swagger | SpringBoot | |
---|---|---|
版本 | 2.9.2 | 2.5.6 |
导入依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
创建配置类
package cc.bnblogs.swagger_study.config;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径,控制器类包
.apis(RequestHandlerSelectors.basePackage("cc.bnblogs.swagger_study.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("Spring Boot集成Swagger2构建RESTful API")
//创建人
.contact(new Contact("barney", "https://hugo.bnblogs.cc", "xxx@xxx.com"))
//版本号
.version("1.0")
//描述
.description("演示系统API描述")
.build();
}
}
访问路径:http://localhost:8080/swagger-ui.html
配置接口扫描策略(RequestHandlerSelectors)
any() // 扫描所有,项目中的所有接口都会被扫描到
none() // 不扫描接口
withMethodAnnotation(final Class<? extends Annotation> annotation)// 通过方法上的注解扫描withMethodAnnotation(GetMapping.class) // 只扫描get请求
withClassAnnotation(final Class<? extends Annotation> annotation) // 通过类上的注解扫描withClassAnnotation(RestController.class) // 只扫描有RestController注解的类中的接口
basePackage(final String basePackage) // 根据包路径扫描接口
配置接口扫描过滤(PathSelectors)
any() // 任何请求都扫描
none() // 任何请求都不扫描
regex(final String pathRegex) // 通过正则表达式控制,返回true扫描,false不扫描
ant(final String antPattern) // 通过ant()表达式控制,返回true扫描,false不扫描
配置要忽略的请求参数
可以通过ignoredParameterTypes()
方法去配置要忽略的参数
配置是否启动Swagger
@Bean
public Docket docket(Environment environment) {
// 设置要显示swagger的环境
Profiles of = Profiles.of("dev", "test");
// 判断当前是处于dev或test环境,通过 enable() 接收此参数判断是否要显示
boolean b = environment.acceptsProfiles(of);
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.ignoredParameterTypes(HttpServletRequest.class)
.enable(b) // 配置是否启用Swagger,如果是false,在浏览器将无法访问
.select()
.apis(RequestHandlerSelectors.basePackage("cc.bnblogs.swagger_study.controller")).build();
}
配置接口分组
通过groupName()
方法即可配置分组,如按照不同的controller
分组
@Bean
public Docket docketDemo() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("demo")
.apiInfo(apiInfo())
.select()
.paths(PathSelectors.ant("/demo/**"))
.build();
}
@Bean
public Docket docketHello() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("hello")
.apiInfo(apiInfo())
.select()
.paths(PathSelectors.ant("/hello/**"))
.build();
}
实体配置
并不是因为@ApiModel
这个注解让实体显示在这里了,而是出现在接口方法的返回值或者使用@RequestBody
入参的实体都会显示在这里(这是因为Swagger会扫描json
格式的实体数据)
而@ApiModel
和@ApiModelProperty
这两个注解只是为实体添加注释的。
-
@ApiModel
为类添加注释 -
@ApiModelProperty
为类属性添加注释
例如定义下面的Student
实体
@ApiModel("学生表")
public class Student {
@ApiModelProperty("学号")
private Integer id;
@ApiModelProperty("姓名")
private String name;
}
配置全局参数
所有接口都需要携带的参数
header
: 请求头参数
query
: url
中的请求参数
@Bean
public Docket docket(){
// 新建一个全局参数
Parameter token = new ParameterBuilder().name("token")
// 描述信息
.description("用户登录令牌")
// 该参数放在请求头
.parameterType("header") // 也可以设置query参数,
// 参数的类型
.modelRef(new ModelRef("String"))
// 该参数必填
.required(true)
.build();
List<Parameter> parameters = new ArrayList<>();
parameters.add(token);
return new Docket(DocumentationType.SWAGGER_2)
.globalOperationParameters(parameters).apiInfo(apiInfo());
}
接口备注信息
给Swagger
上的一些接口提供备注信息
@Api(tags = "demo接口")
@RestController
@RequestMapping("/demo/")
public class DemoController {
@GetMapping
@ApiOperation("输出hello world")
public String greet() {
return "Hello, World";
}
@PostMapping("/{id}/")
@ApiOperation("提交一个id")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", example = "1"),
@ApiImplicitParam(name = "name", value = "姓名", example = "admin")
})
public Integer addInfo(@RequestParam Integer id,
@RequestParam String name) {
System.out.println(name);
return id;
}
}
java.lang.NumberFormatException报错解决
-
方案1
给各个实体类上的每个非
String
字段提供参考值@ApiModelProperty(name = "学号",example = "1") private Integer id;
-
方案2
修改
pom.xml
文件,不使用原来swagger-models(v1.5.20)
,改用swagger-models(v1.5.22)
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>1.5.22</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
参考文档