当前位置:网站首页>Swagger 3.0 brushes the screen every day. Does it really smell good?
Swagger 3.0 brushes the screen every day. Does it really smell good?
2020-11-06 20:13:00 【itread01】
Continuous original output , Click on the blue word above to follow me
Catalog
-
Preface -
How to say official documents ? -
Spring Boot Version Description -
New dependencies -
springfox-boot-starter What has been done ? -
Rolling up your sleeves is dry ? -
Customize a basic file example -
How files are grouped ? -
How to add authorization information ? -
How to carry public request arguments ?
-
-
It's a rough one BUG -
Summary
Preface
Recently, it has been frequently affected by Swagger 3.0 refresh , Officials say it's a breakthrough change , There are a lot of highlights , I don't really believe , Today, I'd like to show you some fresh food , Let's see if the soup is fresh or not ....
How to say official documents ?
The project is open source in Github On , Address :https://github.com/springfox/springfox.
Swagger 3.0 What are the changes ? The official documents summarize the following :
-
Deleted the springfox-swagger2The dependence of -
Delete all @EnableSwagger2...Notes -
Added springfox-boot-starterDependencies -
Removed guavaThird party dependence -
File access address changed , Changed to http://ip:port/project/swagger-ui/index.html.
Let's see here , How do you feel at first ?
Now that someone else has updated it , We can't help it , I 'll introduce you to Spring Boot How to integrate Swagger 3.0 Well .
Spring Boot Version Description
Author use Spring Boot The version is 2.3.5.RELEASE
New dependencies
Swagger 3.0 We already have Spring Boot Integrated starter , Just add the following dependencies :
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
springfox-boot-starter What has been done ?
Swagger 3.0 One of the main features of the main push is the starter , So what does this starter do ?
「 Remember 」: All classes are automatically configured in the starter logic .
find springfox-boot-starter Automatic configuration class of , stay /META-INF/spring.factories In Archives , as follows :
As you can see from the picture above , Auto configuration class is OpenApiAutoConfiguration, The original code is as follows :
@Configuration
@EnableConfigurationProperties(SpringfoxConfigurationProperties.class)
@ConditionalOnProperty(value = "springfox.documentation.enabled", havingValue = "true", matchIfMissing = true)
@Import({
OpenApiDocumentationConfiguration.class,
SpringDataRestConfiguration.class,
BeanValidatorPluginsConfiguration.class,
Swagger2DocumentationConfiguration.class,
SwaggerUiWebFluxConfiguration.class,
SwaggerUiWebMvcConfiguration.class
})
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, JacksonAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class })
public class OpenApiAutoConfiguration {
}
Dare you, this automatic configuration class did nothing , Just import a few configuration classes (@Import) And turn on property configuration (@EnableConfigurationProperties).
「 Emphasis 」: Remember
OpenApiDocumentationConfigurationThis configuration class , At first glance, this is a BUG, I don't want to go into , The code in it is poorly written , No notes .
Rolling up your sleeves is dry ?
Seriously , It's the same as before , It's really not a big change , Follow the steps of the document step by step .
Customize a basic file example
Everything still needs to be configured manually , Seriously , I thought I would configure it in the global configuration file . Ah , I think too much. . The configuration classes are as follows :
@EnableOpenApi
@Configuration
@EnableConfigurationProperties(value = {SwaggerProperties.class})
public class SwaggerConfig {
/**
* Configuration properties
*/
@Autowired
private SwaggerProperties properties;
@Bean
public Docket frontApi() {
return new Docket(DocumentationType.OAS_30)
// Whether to open , Configuration according to environment
.enable(properties.getFront().getEnable())
.groupName(properties.getFront().getGroupName())
.apiInfo(frontApiInfo())
.select()
// Specify the package to scan
.apis(RequestHandlerSelectors.basePackage(properties.getFront().getBasePackage()))
.paths(PathSelectors.any())
.build();
}
/**
* Front desk API Information
*/
private ApiInfo frontApiInfo() {
return new ApiInfoBuilder()
.title(properties.getFront().getTitle())
.description(properties.getFront().getDescription())
.version(properties.getFront().getVersion())
.contact( // New developer information
new Contact(properties.getFront().getContactName(), properties.getFront().getContactUrl(),
properties.getFront().getContactEmail()))
.build();
}
}
@EnableOpenApi The annotation file is explained as follows :
Indicates that Swagger support should be enabled.
This should be applied to a Spring java config and should have an accompanying '@Configuration' annotation.
Loads all required beans defined in @see SpringSwaggerConfig
What do you mean ? The general meaning is 「 Only the configuration class is marked with @EnableOpenApi This annotation will generate Swagger file 」.
@EnableConfigurationProperties This annotation enables custom property configuration to be enabled , This is the author's custom Swagger To configure .
In short, the configuration is the same as before , According to official documents , You need to add a
@EnableOpenApiNotes .
How files are grouped ?
We all know , A project may be divided into Front desk , Backstage ,APP End , Small program side ..... The interface on each end may still be the same , It's impossible to put them all together , It must be distinguished .
therefore , In actual development, files must be grouped .
Grouping is actually very simple ,Swagger towards IOC Put a Docket This is a group file , One of them groupName() Method to specify the name of the group .
So you just need to inject multiple Docket Specify a different group name , Of course , The titles of these documents 、 describe 、 Scanning paths can be customized .
Two are configured as follows Docket, It's divided into front desk and backstage , The configuration classes are as follows :
@EnableOpenApi
@Configuration
@EnableConfigurationProperties(value = {SwaggerProperties.class})
public class SwaggerConfig {
/**
* Configuration properties
*/
@Autowired
private SwaggerProperties properties;
@Bean
public Docket frontApi() {
return new Docket(DocumentationType.OAS_30)
// Whether to open , Configuration according to environment
.enable(properties.getFront().getEnable())
.groupName(properties.getFront().getGroupName())
.apiInfo(frontApiInfo())
.select()
// Specify the package to scan
.apis(RequestHandlerSelectors.basePackage(properties.getFront().getBasePackage()))
.paths(PathSelectors.any())
.build();
}
/**
* Front desk API Information
*/
private ApiInfo frontApiInfo() {
return new ApiInfoBuilder()
.title(properties.getFront().getTitle())
.description(properties.getFront().getDescription())
.version(properties.getFront().getVersion())
.contact( // New developer information
new Contact(properties.getFront().getContactName(), properties.getFront().getContactUrl(),
properties.getFront().getContactEmail()))
.build();
}
/**
* Backstage API
*/
@Bean
public Docket backApi() {
return new Docket(DocumentationType.OAS_30)
// Whether to open , Configuration according to environment
.enable(properties.getBack().getEnable())
.groupName(" Back office management ")
.apiInfo(backApiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(properties.getBack().getBasePackage()))
.paths(PathSelectors.any())
.build();
}
/**
* Backstage API Information
*/
private ApiInfo backApiInfo() {
return new ApiInfoBuilder()
.title(properties.getBack().getTitle())
.description(properties.getBack().getDescription())
.version(properties.getBack().getVersion())
.contact( // New developer information
new Contact(properties.getBack().getContactName(), properties.getBack().getContactUrl(),
properties.getBack().getContactEmail()))
.build();
}
}
Attribute configuration file SwaggerProperties as follows , It is divided into two different attribute configurations of foreground and background :
/**
* swagger Property configuration class for
*/
@ConfigurationProperties(prefix = "spring.swagger")
@Data
public class SwaggerProperties {
/**
* Foreground interface configuration
*/
private SwaggerEntity front;
/**
* Background interface configuration
*/
private SwaggerEntity back;
@Data
public static class SwaggerEntity {
private String groupName;
private String basePackage;
private String title;
private String description;
private String contactName;
private String contactEmail;
private String contactUrl;
private String version;
private Boolean enable;
}
}
Here is a screenshot of the file , You can see that there are two different groups :
How to add authorization information ?
Project now API There must be license authentication , Otherwise you can't access , For example, ask to carry a TOKEN.
stay Swagger Authentication information can also be configured in , In this way, each request will be carried by default .
stay Docket There are two ways to specify authorization information in , The difference is securitySchemes() and securityContexts(). The configuration in the configuration class is as follows , Building Docket When you set it in, you can :
@Bean
public Docket frontApi() {
RequestParameter parameter = new RequestParameterBuilder()
.name("platform")
.description(" Request head ")
.in(ParameterType.HEADER)
.required(true)
.build();
List<RequestParameter> parameters = Collections.singletonList(parameter);
return new Docket(DocumentationType.OAS_30)
// Whether to open , Configuration according to environment
.enable(properties.getFront().getEnable())
.groupName(properties.getFront().getGroupName())
.apiInfo(frontApiInfo())
.select()
// Specify the package to scan
.apis(RequestHandlerSelectors.basePackage(properties.getFront().getBasePackage()))
.paths(PathSelectors.any())
.build()
.securitySchemes(securitySchemes())
.securityContexts(securityContexts());
}
/**
* Set authorization information
*/
private List<SecurityScheme> securitySchemes() {
ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue());
return Collections.singletonList(apiKey);
}
/**
* Global application of authorization information
*/
private List<SecurityContext> securityContexts() {
return Collections.singletonList(
SecurityContext.builder()
.securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
.build()
);
}
After the above configuration is successful , stay Swagger There will be Authorize Button , Just add in the request header . Here's the picture :
How to carry public request arguments ?
Different architectures may send requests in addition to carrying TOKEN, It also carries different arguments , For example, the requested platform , Version, etc. , The arguments that each request carries are called public arguments .
So how is Swagger How about the public arguments defined in ? For example, carry in the request header .
stay Docket The method in globalRequestParameters() Public request arguments can be set , The received argument is a List<RequestParameter>, So just build one RequestParameter Assemble , as follows :
@Bean
public Docket frontApi() {
// Construct a public request argument platform, Put in header
RequestParameter parameter = new RequestParameterBuilder()
// Argument name
.name("platform")
// describe
.description(" Requested platform ")
// Put it in header in
.in(ParameterType.HEADER)
// Is it necessary
.required(true)
.build();
// Build a set of request arguments
List<RequestParameter> parameters = Collections.singletonList(parameter);
return new Docket(DocumentationType.OAS_30)
.....
.build()
.globalRequestParameters(parameters);
}
The above configuration is complete , You will see a request header in each interface , Here's the picture :
It's a rough one BUG
When the author introduces the automatic configuration class, he mentioned , Now let's make a brief analysis of .
OpenApiAutoConfiguration This autoconfiguration class has already imported OpenApiDocumentationConfiguration This configuration class , The following code :
@Import({
OpenApiDocumentationConfiguration.class,
......
})
@EnableOpenApi The original code of is as follows :
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = {java.lang.annotation.ElementType.TYPE})
@Documented
@Import(OpenApiDocumentationConfiguration.class)
public @interface EnableOpenApi {
}
You can see from the original code that :@EnableOpenApi The function of this annotation is to import OpenApiDocumentationConfiguration This configuration class , Nani ???
Now that you're already configuring classes automatically OpenApiAutoConfiguration It's in , Then, whether you need to label the configuration class or not @EnableOpenApi Annotations don't always open Swagger Support ?
「 Test it 」: Do not label on configuration class @EnableOpenApi This note , See if Swagger Perform normally . The results were expected , It can still be executed normally .
「 Summary 」: The author only makes a general analysis of , This could be a
BUGOr there are other purposes to follow , So it turns out , I don't want to verify it , It doesn't mean anything .
Summary
This article is also a taste of fresh , I don't feel very fragrant , A little disappointed . Do you like it? ?
Spring BootThe integrated source code has been uploaded , Need friend public name reply key words 「Swagger3.0」 Get . Click to go
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
边栏推荐
- What are the common problems of DTU connection
- Python基础变量类型——List浅析
- Pattern matching: The gestalt approach一种序列的文本相似度方法
- What are the criteria for selecting a cluster server?
- 【ElasticSearch搜索引擎】
- How to use parameters in ES6
- html+vue.js 實現分頁可相容IE
- How to customize sorting for pandas dataframe
- Using NLP and ml to extract and construct web data
- 【转发】查看lua中userdata的方法
猜你喜欢

前端工程师需要懂的前端面试题(c s s方面)总结(二)

Wow, elasticsearch multi field weight sorting can play like this

Markdown tricks

Get twice the result with half the effort: automation without cabinet

Cglib 如何实现多重代理?

游戏开发中的新手引导与事件管理系统

Python基础数据类型——tuple浅析

A brief history of neural networks

JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m

Behind the first lane level navigation in the industry
随机推荐
vue任意关系组件通信与跨组件监听状态 vue-communication
Python filtering sensitive word records
use Asponse.Words Working with word templates
For a while, a dynamic thread pool was created, and the source code was put into GitHub
ES6学习笔记(二):教你玩转类的继承和类的对象
Read the advantages of Wi Fi 6 over Wi Fi 5 in 3 minutes
How to understand Python iterators and generators?
It's time for your financial report to change to a more advanced style -- financial analysis cockpit
Vue.js Mobile end left slide delete component
2020年数据库技术大会助力技术提升
[efficiency optimization] Nani? Memory overflow again?! It's time to sum up the wave!!
A course on word embedding
C# 调用SendMessage刷新任务栏图标(强制结束时图标未消失)
Flink的DataSource三部曲之一:直接API
仅用六种字符来完成Hello World,你能做到吗?
前端工程师需要懂的前端面试题(c s s方面)总结(二)
Gather in Beijing! The countdown to openi 2020
Elasticsearch数据库 | Elasticsearch-7.5.0应用搭建实战
[Xinge education] poor learning host computer series -- building step 7 Simulation Environment
Custom function form of pychar shortcut key