swagger的API掃描提供了四種方式,分別如下:
- 1、RequestHandlerSelectors.any() 匹配任何controller的接口
- 2、RequestHandlerSelectors.withClassAnnotation() 掃描含有類注解的
- 3、RequestHandlerSelectors.withMethodAnnotation() 掃描含有方法注解的
- 3、RequestHandlerSelectors.basePackage() 掃描指定包路徑
@Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.fan.controller")) .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) .paths(PathSelectors.any()) .build().globalOperationParameters(defaultHeader()); }
如上代碼,在.apis()方法中可以進行配置掃描條件,可以通過apis進行多次設置,apis方法參數為Predicate<RequestHandler> selector。
// apis方法源碼 public ApiSelectorBuilder apis(Predicate<RequestHandler> selector) { this.requestHandlerSelector = Predicates.and(this.requestHandlerSelector, selector); return this; }
查看apis方法的源碼可以發現,條件參數selector被Predicates以and()方法操作,並返回一個Predicate<RequestHandler>類,Predicates.and()實際上完成"條件1 and 條件2"的操作,類似於sql語句where條件的內容,根據這個特點,可以通過Predicates.and()和Predicates.or()的方法完成"(條件1 and 條件2) or 條件3"的操作,就可以掃描任何指定包下的API,並實現多路徑掃描、交集、並集等配置。swagger示例如下:
package com.fan.ams.config; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import io.swagger.annotations.ApiOperation; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import springfox.documentation.RequestHandler; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import java.util.List; @EnableWebMvc @EnableSwagger2 @Configuration public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(getBasePackages()) .paths(PathSelectors.any()) .build(); } // 設置多路徑 private Predicate<RequestHandler> getBasePackages() { Predicate<RequestHandler> predicate = Predicates.and(RequestHandlerSelectors.basePackage("com.fan.ams.controller")); // 掃描com.fan.ams.controller包 predicate = Predicates.and(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class), predicate) // 掃描com.fan.ams.controller包下有@ApiOperation,和上面是交集 predicate = Predicates.or(RequestHandlerSelectors.basePackage("com.fan.ams.controller222"), predicate)// 掃描com.fan.ams.controller222包,和上面是並集 return predicate; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("后台API接口文檔") .description("后台API接口文檔") .termsOfServiceUrl("") .contact(new Contact("", "", "1663501@qq.com")) .version("V 1.0.0") .build(); } }