swagger如何優雅的配置多掃描路徑,基於2.9版本


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();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM