关于springfox-swagger配置中的一些理解

关于springfox-swagger配置中的一些理解

对于.apis和.path的理解

这两个的参数应该是传入函数,然后根据函数对需要的路径进行筛选,(apis() allows selection of RequestHandler's using a predicate. The example here uses an any predicate (default). Out of the box predicates provided are any, none, withClassAnnotation, withMethodAnnotation and basePackage.)
如上英语所述,springfox提供了一些函数,这些函数也可以自己进行定义。比如多包扫描如下所示:
方法一:

@Configuration
@EnableSwagger2 //开启swagger2
@Slf4j
public class Swagger2Config {
    // 定义分隔符
    private static final String splitor = ",";
    @Bean
    public Docket createRestApi() {
        log.info("Docket Bean已初始化");
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
//                .apis(RequestHandlerSelectors.basePackage("org.hhu.yu.catalog.departmentDir.management.controller"))
                .apis(Swagger2Config.basePackage("org.hhu.yu"))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .apiInfo(new ApiInfoBuilder().title("YU系统接口测试管理")
                        .termsOfServiceUrl("http://localhost:8089/YU/html/backgroundFrame.html")
                        .description("YU系统文档与测试工具")
                        .version("1.0.0")
                        .build());
    }

    /**
     * Predicate that matches RequestHandler with given base package name for the class of the handler method.
     * This predicate includes all request handlers matching the provided basePackage
     * modify RequestHandlerSelectors.basePackage
     * @param basePackage - base package of the classes
     * @return this
     */
    public static Predicate<RequestHandler> basePackage(final String basePackage) {
        return input->declaringClass(input).transform(handlerPackage(basePackage)).or(true);
    }

    /**
     * 处理包路径配置规则,支持多路径扫描匹配以逗号隔开
     * @param basePackage 扫描包路径
     * @return Function
     */
    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;
        };
    }

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



    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeyList= new ArrayList();
        apiKeyList.add(new ApiKey("x-auth-token", "x-auth-token", "header"));
        return apiKeyList;
    }

    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts=new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build());
        return securityContexts;
    }

    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences=new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }
}

方法2:
通过Api.class
如下所示:

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

    }

其中,最重要的一段代码是:

RequestHandlerSelectors.withClassAnnotation(Api.class)

这一段的作用是根据@Api这个注解进行扫描,所以,还需要在每个接口类上添加上@Api这个注解。

安全配置代码如下

private List<ApiKey> securitySchemes(){
        List<ApiKey> apiKeysList = new ArrayList<>();
        apiKeysList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeysList;
    }

    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts=new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex("^(?!auth).*$"))
                .build());
        return securityContexts;
    }

    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences=new ArrayList<>();
       securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
       return securityReferences;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值