网上很多支持多包扫描的方法都是这样,这样是错误的,错误代码示例:
@Configuration
@EnableSwagger2
public class SwaggerConfig
{// 定义分隔符,配置Swagger多包
private static final String splitor = ";";/**
* 创建API
*/
@Bean
public Docket createRestApi()
{
return new Docket(DocumentationType.SWAGGER_2)
// 详细定制
.apiInfo(apiInfo())
.select()
// 指定当前包路径,这里就添加了两个包,注意方法变成了basePackage,中间加上成员变量splitor
.apis(basePackage("com.XX.api.controller.broad"+splitor+"com.XX.api.controller.village"))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}/**
* 添加摘要信息
* 这里是接口的描述配置,不重要
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
.title("XXX系统_接口文档")
.description("用于XXX统开发组生成RESTapi风格的接口...")
// .contact(new Contact(Global.getName(), null, null))
// .version("版本号:" + Global.getVersion())
.build();
}
/**
* 重写basePackage方法,使能够实现多包访问,复制贴上去
* @author teavamc
* @date 2019/1/26
* @param [basePackage]
* @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
*/
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}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;
};
}private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
}
这种方法你会发现input.declaringClass()是报错的。后来我发现可以使用另外一种方式解决多包扫描的问题:
@Value("${swagger.enable}") private boolean isSwaggerEnable; @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() ; }
可以看出,重要的代码是:
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
使用时,只需要在我们所需要扫描的controller上添加:
@Api(value = "api/test", description = "测试")
注解,这样就可以跨多包进行扫描路径了。