swagger多包扫描

在项目中swagger的接口文档使用的还是很方便的,swagger有很多中扫描接口的方式,可以自行的配置

但是swagger配置通过包扫描的方式时,而当我们想要扫描多个包的时候,就发现,swagger给的api当中只有一个string参数,就很不方便

所以自行寻找了一些配置多包扫描的方式

首先需要导入guava依赖包

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.1-jre</version>
</dependency>

然后开始配置

import com.google.common.base.Function;
import com.google.common.base.Optional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.function.Predicate;

@Configuration
public class SwaggerConfig
    
	@Bean
    public Docket createRestApi()
    {
        return new Docket(DocumentationType.OAS_30)
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo(apiInfo())
                // 设置哪些接口暴露给Swagger展示
                .select()
                // 扫描指定包的接口
            	// 只支持一个包路径
                //.apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
            	// 多包扫描
            	.apis(basePackage("com.xxx.xxx1", "com.xxx.xxx2"))
                // 扫描所有 .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }

	private static Predicate<RequestHandler> basePackage(String... basePackages) {
        return input -> declaringClass(input).transform(handlerPackage(basePackages)).or(true);
    }

    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
        return Optional.fromNullable(input.declaringClass());
    }

    private static Function<Class<?>, Boolean> handlerPackage(String[] basePackage)     {
        return input -> {
            // 循环判断匹配
            for (String strPackage : basePackage) {
                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
                if (isMatch) {
                    return true;
                }
            }
            return false;
        };
    }

	/**
     * 添加摘要信息
     */
    private ApiInfo apiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title("标题:xxx系统_接口文档")
                // 描述
                .description("描述:用于管理xxxxx信息,具体包括XXX,XXX模块...")
                // 作者信息
                .contact(new Contact("xxxx", null, null))
                // 版本
                .version("版本号:" + "1.0")
                .build();
    }

上一篇 下一篇