com.itcoon.common.web.swagger.config.SwaggerConfig Maven / Gradle / Ivy
package com.itcoon.common.web.swagger.config;
import com.itcoon.common.core.enums.DescribedEnum;
import com.itcoon.common.core.enums.ValueEnum;
import com.itcoon.common.web.swagger.config.property.SwaggerConfigurerProperty;
import com.itcoon.common.web.swagger.plugin.swagger2.ApiEnumPropertyBuilderPlugin;
import com.itcoon.common.web.swagger.plugin.swagger2.CodeEnumPropertyBuilderPlugin;
import com.itcoon.common.web.swagger.plugin.swagger2.EnumExpandedParameterBuilderPlugin;
import com.itcoon.common.web.swagger.plugin.swagger2.EnumParameterBuilderPlugin;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.DescriptionResolver;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
*
* @author itsherman
* @since 2019-09-04
*/
@EnableSwagger2
@EnableConfigurationProperties(SwaggerConfigurerProperty.class)
@ConditionalOnProperty(prefix = "spring.http.web.swagger", name = "enable", havingValue = "true")
public class SwaggerConfig {
@Autowired
private DescriptionResolver descriptions;
@Autowired
private SwaggerConfigurerProperty configurerProperty;
@Bean
public Docket docket() {
ApiSelectorBuilder apis = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(ApiInfo.DEFAULT)
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class));
String[] patterns = configurerProperty.getPathAntPatterns();
if(patterns != null){
for (String pattern : patterns) {
apis = apis.paths(PathSelectors.ant(pattern));
}
}
Docket docket = apis.build();
if(configurerProperty.getSecurity().isEnable()){
docket.securitySchemes(securitySchemes(configurerProperty.getSecurity().getSchemas()));
docket.securityContexts(securityContexts(configurerProperty.getSecurity().getSchemas()));
}
return docket;
}
@Bean
public ApiEnumPropertyBuilderPlugin apiEnumPropertyBuilderPlugin(){
return new ApiEnumPropertyBuilderPlugin();
}
@Bean
@ConditionalOnClass(value = {ValueEnum.class, DescribedEnum.class})
public CodeEnumPropertyBuilderPlugin codeEnumPropertyBuilderPlugin(){
return new CodeEnumPropertyBuilderPlugin(descriptions);
}
@Bean
@ConditionalOnClass(value = {ValueEnum.class, DescribedEnum.class})
public EnumExpandedParameterBuilderPlugin codeEnumExpandBuilderPlugin(){
return new EnumExpandedParameterBuilderPlugin(descriptions);
}
@Bean
public EnumParameterBuilderPlugin enumParameterBuilderPlugin(){
return new EnumParameterBuilderPlugin(descriptions);
}
private List securitySchemes(SwaggerConfigurerProperty.Security.Schema[] schemas) {
List res = new ArrayList<>();
Arrays.stream(schemas).forEach(schema->res.add(schema.getSecurityScheme()));
return res;
}
private List securityContexts(SwaggerConfigurerProperty.Security.Schema[] schemas) {
List res = new ArrayList<>();
res.add(SecurityContext.builder()
.securityReferences(defaultAuth(schemas))
.forPaths(PathSelectors.regex("/.*"))
.build());
return res;
}
private List defaultAuth(SwaggerConfigurerProperty.Security.Schema[] schemas) {
List res = new ArrayList<>();
Arrays.stream(schemas).forEach(schema->res.add(schema.getSecurityReference()));
return res;
}
}