关于springfox-swagger配置中的一些理解
对于.apis和.path的理解
这两个的参数应该是传入函数,然后根据函数对需要的路径进行筛选,(apis() allows selection of RequestHandler's using a predicate. The example here uses an any predicate (default). Out of the box predicates provided are any, none, withClassAnnotation, withMethodAnnotation and basePackage.)
如上英语所述,springfox提供了一些函数,这些函数也可以自己进行定义。比如多包扫描如下所示:
方法一:
@Configuration
@EnableSwagger2 //开启swagger2
@Slf4j
public class Swagger2Config {
// 定义分隔符
private static final String splitor = ",";
@Bean
public Docket createRestApi() {
log.info("Docket Bean已初始化");
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
// .apis(RequestHandlerSelectors.basePackage("org.hhu.yu.catalog.departmentDir.management.controller"))
.apis(Swagger2Config.basePackage("org.hhu.yu"))
.paths(PathSelectors.any())
.build()
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.apiInfo(new ApiInfoBuilder().title("YU系统接口测试管理")
.termsOfServiceUrl("http://localhost:8089/YU/html/backgroundFrame.html")
.description("YU系统文档与测试工具")
.version("1.0.0")
.build());
}
/**
* Predicate that matches RequestHandler with given base package name for the class of the handler method.
* This predicate includes all request handlers matching the provided basePackage
* modify RequestHandlerSelectors.basePackage
* @param basePackage - base package of the classes
* @return this
*/
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input->declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
/**
* 处理包路径配置规则,支持多路径扫描匹配以逗号隔开
* @param basePackage 扫描包路径
* @return Function
*/
private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
return input -> {
for (String strPackage : basePackage.split(splitor)) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
/**
* @param input RequestHandler
* @return Optional
*/
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
private List<ApiKey> securitySchemes() {
List<ApiKey> apiKeyList= new ArrayList();
apiKeyList.add(new ApiKey("x-auth-token", "x-auth-token", "header"));
return apiKeyList;
}
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts=new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$"))
.build());
return securityContexts;
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences=new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
}
方法2:
通过Api.class
如下所示:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
// .groupName("api")
.enable(isSwaggerEnable)
.apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
// .apis(RequestHandlerSelectors.basePackage("com.MC.modules.sys.web"))
// 对所有路径进行扫描
.paths(PathSelectors.any())
.build()
;
}
其中,最重要的一段代码是:
RequestHandlerSelectors.withClassAnnotation(Api.class)
这一段的作用是根据@Api这个注解进行扫描,所以,还需要在每个接口类上添加上@Api这个注解。
安全配置代码如下
在 private List<ApiKey> securitySchemes(){
List<ApiKey> apiKeysList = new ArrayList<>();
apiKeysList.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeysList;
}
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts=new ArrayList<>();
securityContexts.add(SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$"))
.build());
return securityContexts;
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences=new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}