swagger2解决只能单包扫描的问题,支持多包扫描,解决input.declaringClass()报错
网上很多支持多包扫描的方法都是这样,这样是错误的,错误代码示例:@Configuration@EnableSwagger2public class SwaggerConfig{// 定义分隔符,配置Swagger多包private static final String splitor = ";";/*** 创建API*/...
网上很多支持多包扫描的方法都是这样,这样是错误的,错误代码示例:
@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 = "测试")
注解,这样就可以跨多包进行扫描路径了。
更多推荐



所有评论(0)