欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

[Swagger]-Swagger学习

时间:2023-06-15
Swagger学习

参考视频链接
官方文档链接

SpringBoot集成Swagger

1.导入依赖

io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2

2.创建Swagger配置类

@EnableSwagger2 //开启Swagger2@Configuration //标志该类是项目的配置类public class Swagger2Config {}

3.访问项目的swagger-ui.html就是ui界面

可以看到ui界面大体可以分为四部分:选择框,api信息,控制层请求接口信息以及项目的model实体类信息

配置swagger

swagger的配置需要一个Docket类的bean。而Docket类的构造函数只有一个:

public Docket(documentationType documentationType) { this.apiInfo = ApiInfo.DEFAULT; ...... this.documentationType = documentationType;}

documentationType类中有三个static final修饰的documentationType变量:

public class documentationType extends SimplePluginmetadata { public static final documentationType SWAGGER_12 = new documentationType("swagger", "1.2"); public static final documentationType SWAGGER_2 = new documentationType("swagger", "2.0"); public static final documentationType SPRING_WEB = new documentationType("spring-web", "1.0"); ...}

所以Docket的构造函数只需传入documentationType.SWAGGER_2即可。这样构造出Docket后其中的属性都是默认的,可使用其中的方法对属性进行配置
如apiInfo方法可以配置api信息;enable方法可以指定是否开启Swagger;groupName方法可以指定该docket的接口api的组名;tags方法可以配置某些标签,可以在描述控制器的名称或描述信息等时使用(后续的@Api注解);forCodeGeneration方法可以设置泛型在编码时的格式,具体在文档中的描述是这样的:

配置api信息

Docket中的apiInfo方法可以配置api的信息。该方法需要传入一个ApiInfo类对象,该类中包括以下信息:

private final String version; //项目版本号private final String title; //项目标题private final String description; //项目等的描述private final String termsOfServiceUrl; //服务条款urlprivate final String license; //证书private final String licenseUrl; //证书url private final Contact contact; //联系人 private final List vendorExtensions; //其它扩展信息

ApiInfo类中只提供了全参构造器以及各属性的get方法没有set方法,所以可以使用全参构造器构造ApiInfo类对象。除此之外可以使用ApiInfoBuilder类来构造ApiInfo,借助ApiInfoBuilder可以通过单个方法设置ApiInfo的各项属性,比直接调用ApiInfo类的全参构造器就更灵活且简洁,设置完属性调用build方法就可以返回一个ApiInfo对象,该方法实际上也是在调用ApliInfo的全参构造方法

配置标签

通过Docket中的tags方法可以设置标签,该方法接收一个Tags对象,一般使用Tag(String name, String description)构造方法构造,指定tag的名称以及该tag要描述的信息。被构造出来的标签不管有没有被使用到类或方法上都会在ui界面上显示出来
使用时只需在控制器类上加@Api注解,然后将其中的tags属性指定为某个Tags的name属性即可将这个类与这个标签绑定在一起
当然请求方法也可以跟某个tags绑定在一起,但是这样的话会造成方法跟类之间没有层级关系而是平行关系,可读性降低了

配置接口信息 接口扫描

通过Docket的select方法会得到该Docket的ApiSelectorBuilder类对象,该对象就是用于配置api接口信息的
通过apis方法指定扫描接口的方式,该方法接受一个泛型为RequestHandler接口类型的Predicate接口参数,RequestHandlerSelectors类中对此有具体的实现:basePackage方法可以指定扫描某个包下的请求接口;any扫描全部接口;none都不扫描;withClassAnnotation扫描有指定注解的类中的接口;withMethodAnnotation扫描有指定注解的方法上的接口
通过paths可以指定扫描哪些请求路径,类似于apis方法,该方法调用PathSelectors类中的方法作为参数:any指定扫描所有请求路径;none不扫描任何路径;ant方法接收一个字符串路径模式(如"/**"),指定扫描符合该指定模式的路径;regex方法接收一个正则表达式,指定扫描符合正则表达式的路径
接口的扫描指定好后,调用build方法即可得到原先的Docket
@ApiIgnore用于类或方法或参数上,表示被注解的项要被忽略

添加接口描述信息

@Api用在类上,添加整个类中的所有接口的描述信息(使用tags属性)
@ApiOperation用在方法上,添加方法(请求接口)的描述信息
@ApiParam用在方法参数(请求参数)前面,添加参数的描述信息以及参数是否必须等

配置api分组

一个项目中可以设定多个Docket,每个Docket配置自己的组名,接口api信息等其它性质,不同Docket的接口就是不同组的,在ui界面的选择框可以选择不同组别进行展示

配置实体类信息

只要控制层请求接口的返回值存在实体类,它就会被扫描到swagger中
在实体类上加注解@ApiModel可以添加实体类的描述信息
在实体类中的成员变量上加注解@ApiModelProperty可以添加字段的描述信息(如果成员变量是public修饰直接这样就可以,如果是private修饰就需要加上get和set方法才能生效)

代码示例

swagger配置类

@Configuration@EnableSwagger2public class SwaggerConfig { @Bean public Docket docket(){ return new Docket(documentationType.SWAGGER_2) .apiInfo(apiInfo()) .groupName("这里是GroupName") .forCodeGeneration(true) .tags(new Tag("这是标签的名字","这是标签对应要描述的信息")) .tags(new Tag("这个标签创建了但是没有使用","还是会显示出来")) .select() .apis(RequestHandlerSelectors.basePackage("com.xxx.www.testcontroller")) //.paths(PathSelectors.ant("/test/*")) .build(); } @Bean public Docket docket2(){ return new Docket(documentationType.SWAGGER_2) .groupName("这里是第二个GroupName"); } public ApiInfo apiInfo(){ return new ApiInfoBuilder() .title("这里是title") .version("这里是version") .description("这里是description") .build(); }}

控制器

@Api(value = "这是类",tags = {"这是标签的名字"})@RestController@RequestMapping("/test")public class TestController { @ApiOperation(value = "这是接口描述") @GetMapping("/testUser") public List test(List result) { return new ArrayList(); }}

ui界面

总结

正式发布时应关闭swagger,出于安全考虑,避免暴露接口,同时节约运行所需资源
swagger在代码层面需要做配置,注解等,具有一定的代码植入性

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。