1 依赖引入
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version></parent><dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> <!--测试包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 文件处理器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8</version> </dependency> <!-- Work around springfox --> <!-- https://mvnrepository.com/artifact/org.springframework.plugin/spring-plugin-core --> <dependency> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-core</artifactId> <version>2.0.0.RELEASE</version> </dependency></dependencies>
2 application.yml
spring: application: name: springfox-swaggerserver: port: 8080# ===== 自定义swagger配置 ===== #swagger: enable: true application-name: ${spring.application.name} application-version: 1.0 application-description: springfox swagger 3.0整合Demo try-host: http://localhost:${server.port}
3 启动类
@SpringBootApplication@EnableOpenApipublic class Swagger3Application { public static void main(String[] args){ SpringApplication.run(Swagger3Application.class,args); }}
4 读取文件配置
package com.hikktn.vo;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** * @author hikktn */@Component@ConfigurationProperties("swagger")public class SwaggerProperties { /** * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量 */ private Boolean enable; /** * 项目应用名 */ private String applicationName; /** * 项目版本信息 */ private String applicationVersion; /** * 项目描述信息 */ private String applicationDescription; /** * 接口调试地址 */ private String tryHost; public Boolean getEnable() { return enable; } public void setEnable(Boolean enable) { this.enable = enable; } public String getApplicationName() { return applicationName; } public void setApplicationName(String applicationName) { this.applicationName = applicationName; } public String getApplicationVersion() { return applicationVersion; } public void setApplicationVersion(String applicationVersion) { this.applicationVersion = applicationVersion; } public String getApplicationDescription() { return applicationDescription; } public void setApplicationDescription(String applicationDescription) { this.applicationDescription = applicationDescription; } public String getTryHost() { return tryHost; } public void setTryHost(String tryHost) { this.tryHost = tryHost; }}
5 Swagger3配置
package com.hikktn.config;import com.hikktn.vo.SwaggerProperties;import io.swagger.annotations.ApiOperation;import io.swagger.models.auth.In;import org.apache.commons.lang3.reflect.FieldUtils;import org.springframework.boot.SpringBootVersion;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.util.ReflectionUtils;import org.springframework.web.servlet.config.annotation.InterceptorRegistration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.oas.annotations.EnableOpenApi;import springfox.documentation.service.*;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.Docket;import java.lang.reflect.Field;import java.util.*;/** * @Author hikktn * @Description swagger3配置 */@EnableOpenApi@Configurationpublic class SwaggerConfiguration implements WebMvcConfigurer { private final SwaggerProperties swaggerProperties; public SwaggerConfiguration(SwaggerProperties swaggerProperties) { this.swaggerProperties = swaggerProperties; } @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30).pathMapping("/") // 定义是否开启swagger,false为关闭,可以通过变量控制 .enable(swaggerProperties.getEnable()) // 将api的元信息设置为包含在json ResourceListing响应中。 .apiInfo(apiInfo()) // 接口调试地址 .host(swaggerProperties.getTryHost()) // 选择哪些接口作为swagger的doc发布 .select() .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build() // 支持的通讯协议集合 .protocols(newHashSet("https", "http")) // 授权信息设置,必要的header token等认证信息 .securitySchemes(securitySchemes()) // 授权信息全局应用 .securityContexts(securityContexts()); } /** * API 页面上半部分展示信息 */ private ApiInfo apiInfo() { return new ApiInfoBuilder().title(swaggerProperties.getApplicationName() + " Api Doc") .description(swaggerProperties.getApplicationDescription()) .contact(new Contact("lighter", null, "123456@gmail.com")) .version("Application Version: " + swaggerProperties.getApplicationVersion() + ", Spring Boot Version: " + SpringBootVersion.getVersion()) .build(); } /** * 设置授权信息 */ private List<SecurityScheme> securitySchemes() { ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue()); return Collections.singletonList(apiKey); } /** * 授权信息全局应用 */ private List<SecurityContext> securityContexts() { return Collections.singletonList( SecurityContext.builder() .securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")}))) .build() ); } @SafeVarargs private final <T> Set<T> newHashSet(T... ts) { if (ts.length > 0) { return new LinkedHashSet<>(Arrays.asList(ts)); } return null; } /** * 通用拦截器排除swagger设置,所有拦截器都会自动加swagger相关的资源排除信息 */ @SuppressWarnings("unchecked") @Override public void addInterceptors(InterceptorRegistry registry) { try { Field registrationsField = FieldUtils.getField(InterceptorRegistry.class, "registrations", true); List<InterceptorRegistration> registrations = (List<InterceptorRegistration>) ReflectionUtils.getField(registrationsField, registry); if (registrations != null) { for (InterceptorRegistration interceptorRegistration : registrations) { interceptorRegistration .excludePathPatterns("/swagger**/**") .excludePathPatterns("/webjars/**") .excludePathPatterns("/v3/**") .excludePathPatterns("/doc.html"); } } } catch (Exception e) { e.printStackTrace(); } }}
6 控制器
package com.hikktn.vo;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** * @author hikktn */@Component@ConfigurationProperties("swagger")public class SwaggerProperties { /** * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量 */ private Boolean enable; /** * 项目应用名 */ private String applicationName; /** * 项目版本信息 */ private String applicationVersion; /** * 项目描述信息 */ private String applicationDescription; /** * 接口调试地址 */ private String tryHost; public Boolean getEnable() { return enable; } public void setEnable(Boolean enable) { this.enable = enable; } public String getApplicationName() { return applicationName; } public void setApplicationName(String applicationName) { this.applicationName = applicationName; } public String getApplicationVersion() { return applicationVersion; } public void setApplicationVersion(String applicationVersion) { this.applicationVersion = applicationVersion; } public String getApplicationDescription() { return applicationDescription; } public void setApplicationDescription(String applicationDescription) { this.applicationDescription = applicationDescription; } public String getTryHost() { return tryHost; } public void setTryHost(String tryHost) { this.tryHost = tryHost; }}
7 测试
访问url:
http://localhost:8080/swagger-ui/index.html
