forked from jeecgboot/JeecgBoot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
32d00dd
commit 82a2a67
Showing
8 changed files
with
253 additions
and
198 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
365 changes: 182 additions & 183 deletions
365
jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,183 +1,182 @@ | ||
package org.jeecg.config; | ||
|
||
|
||
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; | ||
import io.swagger.annotations.ApiOperation; | ||
import org.jeecg.common.constant.CommonConstant; | ||
import org.springframework.beans.BeansException; | ||
import org.springframework.beans.factory.config.BeanPostProcessor; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.context.annotation.Import; | ||
import org.springframework.util.ReflectionUtils; | ||
import org.springframework.web.bind.annotation.RestController; | ||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; | ||
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; | ||
import springfox.documentation.builders.ApiInfoBuilder; | ||
import springfox.documentation.builders.ParameterBuilder; | ||
import springfox.documentation.builders.PathSelectors; | ||
import springfox.documentation.builders.RequestHandlerSelectors; | ||
import springfox.documentation.oas.annotations.EnableOpenApi; | ||
import springfox.documentation.schema.ModelRef; | ||
import springfox.documentation.service.*; | ||
import springfox.documentation.spi.DocumentationType; | ||
import springfox.documentation.spi.service.contexts.SecurityContext; | ||
import springfox.documentation.spring.web.plugins.Docket; | ||
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; | ||
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; | ||
import springfox.documentation.swagger2.annotations.EnableSwagger2; | ||
|
||
import java.lang.reflect.Field; | ||
import java.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
/** | ||
* @Author scott | ||
*/ | ||
@Configuration | ||
@EnableSwagger2 //开启 Swagger2 | ||
@EnableKnife4j //开启 knife4j,可以不写 | ||
@Import(BeanValidatorPluginsConfiguration.class) | ||
public class Swagger2Config implements WebMvcConfigurer { | ||
|
||
/** | ||
* | ||
* 显示swagger-ui.html文档展示页,还必须注入swagger资源: | ||
* | ||
* @param registry | ||
*/ | ||
@Override | ||
public void addResourceHandlers(ResourceHandlerRegistry registry) { | ||
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); | ||
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); | ||
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); | ||
} | ||
|
||
/** | ||
* swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 | ||
* | ||
* @return Docket | ||
*/ | ||
@Bean(value = "defaultApi2") | ||
public Docket defaultApi2() { | ||
return new Docket(DocumentationType.SWAGGER_2) | ||
.apiInfo(apiInfo()) | ||
.select() | ||
//此包路径下的类,才生成接口文档 | ||
.apis(RequestHandlerSelectors.basePackage("org.jeecg")) | ||
//加了ApiOperation注解的类,才生成接口文档 | ||
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) | ||
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) | ||
.paths(PathSelectors.any()) | ||
.build() | ||
.securitySchemes(Collections.singletonList(securityScheme())) | ||
.securityContexts(securityContexts()) | ||
.globalOperationParameters(setHeaderToken()); | ||
} | ||
|
||
/*** | ||
* oauth2配置 | ||
* 需要增加swagger授权回调地址 | ||
* http://localhost:8888/webjars/springfox-swagger-ui/o2c.html | ||
* @return | ||
*/ | ||
@Bean | ||
SecurityScheme securityScheme() { | ||
return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header"); | ||
} | ||
/** | ||
* JWT token | ||
* @return | ||
*/ | ||
private List<Parameter> setHeaderToken() { | ||
ParameterBuilder tokenPar = new ParameterBuilder(); | ||
List<Parameter> pars = new ArrayList<>(); | ||
tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); | ||
pars.add(tokenPar.build()); | ||
return pars; | ||
} | ||
|
||
/** | ||
* api文档的详细信息函数,注意这里的注解引用的是哪个 | ||
* | ||
* @return | ||
*/ | ||
private ApiInfo apiInfo() { | ||
return new ApiInfoBuilder() | ||
// //大标题 | ||
.title("JeecgBoot 后台服务API接口文档") | ||
// 版本号 | ||
.version("1.0") | ||
// .termsOfServiceUrl("NO terms of service") | ||
// 描述 | ||
.description("后台API接口") | ||
// 作者 | ||
.contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","[email protected]")) | ||
.license("The Apache License, Version 2.0") | ||
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") | ||
.build(); | ||
} | ||
|
||
/** | ||
* 新增 securityContexts 保持登录状态 | ||
*/ | ||
private List<SecurityContext> securityContexts() { | ||
return new ArrayList( | ||
Collections.singleton(SecurityContext.builder() | ||
.securityReferences(defaultAuth()) | ||
.forPaths(PathSelectors.regex("^(?!auth).*$")) | ||
.build()) | ||
); | ||
} | ||
|
||
private List<SecurityReference> defaultAuth() { | ||
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); | ||
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; | ||
authorizationScopes[0] = authorizationScope; | ||
return new ArrayList( | ||
Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); | ||
} | ||
|
||
/** | ||
* 解决springboot2.6 和springfox不兼容问题 | ||
* @return | ||
*/ | ||
@Bean | ||
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { | ||
return new BeanPostProcessor() { | ||
|
||
@Override | ||
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { | ||
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { | ||
customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); | ||
} | ||
return bean; | ||
} | ||
|
||
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { | ||
List<T> copy = mappings.stream() | ||
.filter(mapping -> mapping.getPatternParser() == null) | ||
.collect(Collectors.toList()); | ||
mappings.clear(); | ||
mappings.addAll(copy); | ||
} | ||
|
||
@SuppressWarnings("unchecked") | ||
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { | ||
try { | ||
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); | ||
field.setAccessible(true); | ||
return (List<RequestMappingInfoHandlerMapping>) field.get(bean); | ||
} catch (IllegalArgumentException | IllegalAccessException e) { | ||
throw new IllegalStateException(e); | ||
} | ||
} | ||
}; | ||
} | ||
|
||
|
||
} | ||
//package org.jeecg.config; | ||
// | ||
// | ||
//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; | ||
//import org.jeecg.common.constant.CommonConstant; | ||
//import org.springframework.beans.BeansException; | ||
//import org.springframework.beans.factory.config.BeanPostProcessor; | ||
//import org.springframework.context.annotation.Bean; | ||
//import org.springframework.context.annotation.Configuration; | ||
//import org.springframework.context.annotation.Import; | ||
//import org.springframework.util.ReflectionUtils; | ||
//import org.springframework.web.bind.annotation.RestController; | ||
//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; | ||
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; | ||
//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; | ||
//import springfox.documentation.builders.ApiInfoBuilder; | ||
//import springfox.documentation.builders.ParameterBuilder; | ||
//import springfox.documentation.builders.PathSelectors; | ||
//import springfox.documentation.builders.RequestHandlerSelectors; | ||
//import springfox.documentation.oas.annotations.EnableOpenApi; | ||
//import springfox.documentation.schema.ModelRef; | ||
//import springfox.documentation.service.*; | ||
//import springfox.documentation.spi.DocumentationType; | ||
//import springfox.documentation.spi.service.contexts.SecurityContext; | ||
//import springfox.documentation.spring.web.plugins.Docket; | ||
//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; | ||
//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; | ||
//import springfox.documentation.swagger2.annotations.EnableSwagger2; | ||
// | ||
//import java.lang.reflect.Field; | ||
//import java.util.ArrayList; | ||
//import java.util.Collections; | ||
//import java.util.List; | ||
//import java.util.stream.Collectors; | ||
// | ||
///** | ||
// * @Author scott | ||
// */ | ||
//@Configuration | ||
//@EnableSwagger2 //开启 Swagger2 | ||
//@EnableKnife4j //开启 knife4j,可以不写 | ||
//@Import(BeanValidatorPluginsConfiguration.class) | ||
//public class Swagger2Config implements WebMvcConfigurer { | ||
// | ||
// /** | ||
// * | ||
// * 显示swagger-ui.html文档展示页,还必须注入swagger资源: | ||
// * | ||
// * @param registry | ||
// */ | ||
// @Override | ||
// public void addResourceHandlers(ResourceHandlerRegistry registry) { | ||
// registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); | ||
// registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); | ||
// registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); | ||
// } | ||
// | ||
// /** | ||
// * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 | ||
// * | ||
// * @return Docket | ||
// */ | ||
// @Bean(value = "defaultApi2") | ||
// public Docket defaultApi2() { | ||
// return new Docket(DocumentationType.SWAGGER_2) | ||
// .apiInfo(apiInfo()) | ||
// .select() | ||
// //此包路径下的类,才生成接口文档 | ||
// .apis(RequestHandlerSelectors.basePackage("org.jeecg")) | ||
// //加了ApiOperation注解的类,才生成接口文档 | ||
// .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) | ||
// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) | ||
// .paths(PathSelectors.any()) | ||
// .build() | ||
// .securitySchemes(Collections.singletonList(securityScheme())) | ||
// .securityContexts(securityContexts()) | ||
// .globalOperationParameters(setHeaderToken()); | ||
// } | ||
// | ||
// /*** | ||
// * oauth2配置 | ||
// * 需要增加swagger授权回调地址 | ||
// * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html | ||
// * @return | ||
// */ | ||
// @Bean | ||
// SecurityScheme securityScheme() { | ||
// return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header"); | ||
// } | ||
// /** | ||
// * JWT token | ||
// * @return | ||
// */ | ||
// private List<Parameter> setHeaderToken() { | ||
// ParameterBuilder tokenPar = new ParameterBuilder(); | ||
// List<Parameter> pars = new ArrayList<>(); | ||
// tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); | ||
// pars.add(tokenPar.build()); | ||
// return pars; | ||
// } | ||
// | ||
// /** | ||
// * api文档的详细信息函数,注意这里的注解引用的是哪个 | ||
// * | ||
// * @return | ||
// */ | ||
// private ApiInfo apiInfo() { | ||
// return new ApiInfoBuilder() | ||
// // //大标题 | ||
// .title("JeecgBoot 后台服务API接口文档") | ||
// // 版本号 | ||
// .version("1.0") | ||
//// .termsOfServiceUrl("NO terms of service") | ||
// // 描述 | ||
// .description("后台API接口") | ||
// // 作者 | ||
// .contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","[email protected]")) | ||
// .license("The Apache License, Version 2.0") | ||
// .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") | ||
// .build(); | ||
// } | ||
// | ||
// /** | ||
// * 新增 securityContexts 保持登录状态 | ||
// */ | ||
// private List<SecurityContext> securityContexts() { | ||
// return new ArrayList( | ||
// Collections.singleton(SecurityContext.builder() | ||
// .securityReferences(defaultAuth()) | ||
// .forPaths(PathSelectors.regex("^(?!auth).*$")) | ||
// .build()) | ||
// ); | ||
// } | ||
// | ||
// private List<SecurityReference> defaultAuth() { | ||
// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); | ||
// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; | ||
// authorizationScopes[0] = authorizationScope; | ||
// return new ArrayList( | ||
// Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); | ||
// } | ||
// | ||
// /** | ||
// * 解决springboot2.6 和springfox不兼容问题 | ||
// * @return | ||
// */ | ||
// @Bean | ||
// public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { | ||
// return new BeanPostProcessor() { | ||
// | ||
// @Override | ||
// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { | ||
// if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { | ||
// customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); | ||
// } | ||
// return bean; | ||
// } | ||
// | ||
// private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { | ||
// List<T> copy = mappings.stream() | ||
// .filter(mapping -> mapping.getPatternParser() == null) | ||
// .collect(Collectors.toList()); | ||
// mappings.clear(); | ||
// mappings.addAll(copy); | ||
// } | ||
// | ||
// @SuppressWarnings("unchecked") | ||
// private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { | ||
// try { | ||
// Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); | ||
// field.setAccessible(true); | ||
// return (List<RequestMappingInfoHandlerMapping>) field.get(bean); | ||
// } catch (IllegalArgumentException | IllegalAccessException e) { | ||
// throw new IllegalStateException(e); | ||
// } | ||
// } | ||
// }; | ||
// } | ||
// | ||
// | ||
//} |
Oops, something went wrong.