博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swagger2限定接口范围
阅读量:6364 次
发布时间:2019-06-23

本文共 3489 字,大约阅读时间需要 11 分钟。

前面在中简单介绍了Swagger的使用。

不过默认情况下,Swagger2会把项目中的所有接口都展示在列表里,特别是你用了Springboot/SpringCloud之后,各种内部health check的接口,但其实这些都没必要展示出来。

这时候,你就需要限定接口的范围了。

实现方法

增加一个配置类,简要代码如下:

@Configuration@EnableSwagger2public class Swagger2Config {    @Bean    public Docket buildDocket() {        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()              .apis(RequestHandlerSelectors.basePackage("com.yejg")).paths(PathSelectors.any()).build();    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder().title("接口文档").description("描述文字...").termsOfServiceUrl("https://yejg.top").version("V1.0").build();    }}

有了这个【RequestHandlerSelectors.basePackage("com.yejg")】限定之后,就只会展示【com.yejg】包下的接口了。so easy…

不过,这时候,有个新问题,如果要增加展示 com.springXXX 的接口,怎么办呢?

优化方案

直接上代码之前,先看下优化方案怎么来的。

从代码看,跟目录范围相关的就是apis方法了,源码如下:

// 此Predicate是com.google.common.base.Predicate,不是jdk8的那个,不过原理类似 都是判断的谓词public ApiSelectorBuilder apis(Predicate
selector) { requestHandlerSelector = and(requestHandlerSelector, selector); return this;}

想要支持配置多个目录,就得从这个Predicate下手了。

先看下RequestHandlerSelectors.basePackage是怎么返回Predicate的:

public static Predicate
basePackage(final String basePackage) { return new Predicate
() { @Override public boolean apply(RequestHandler input) { return declaringClass(input).transform(handlerPackage(basePackage)).or(true); } }; } private static Function
, Boolean> handlerPackage(final String basePackage) { return new Function
, Boolean>() { @Override public Boolean apply(Class
input) { return input.getPackage().getName().startsWith(basePackage); } }; }

重点关注上面的handlerPackage方法,它的逻辑就是:判断项目的包路径是否以设定的basePackage开头。

如果改变这里的判断逻辑,判断项目的包路径是否以设定的basePackage1 或者 basePackage2 开头,那就达到同时指定多个目录的效果了。

实现代码如下:

@Configuration@EnableSwagger2public class Swagger2Config {    // 定义分隔符    private static final String SEPARATOR = ",";    @Bean    public Docket buildDocket() {        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()                .apis(basePackage("com.yejg" + SEPARATOR + "com.springXXX"))                .paths(PathSelectors.any()).build();    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder().title("接口文档").description("描述文字...")                .termsOfServiceUrl("https://yejg.top").version("V1.0").build();    }    /**     * @param basePackage     * @return     * @see RequestHandlerSelectors#basePackage(String)     */    public static Predicate
basePackage(final String basePackage) { return new Predicate
() { @Override public boolean apply(RequestHandler input) { return declaringClass(input).transform(handlerPackage(basePackage)).or(true); } }; } private static Function
, Boolean> handlerPackage(final String basePackage) { return input -> { // 循环判断匹配 for (String strPackage : basePackage.split(SEPARATOR)) { boolean isMatch = input.getPackage().getName().startsWith(strPackage); if (isMatch) { return true; } } return false; }; } private static Optional
> declaringClass(RequestHandler input) { return Optional.fromNullable(input.declaringClass()); }}

转载于:https://www.cnblogs.com/yejg1212/p/10500855.html

你可能感兴趣的文章
linux定时任务Crond基础概念原理介绍01
查看>>
老男孩教育shell考试题猜数字游戏实战
查看>>
关于一些优秀的链接地址
查看>>
CSS display 属性详解
查看>>
Linux文件系统标准FHS
查看>>
我的友情链接
查看>>
常见的网络管理技术之snmp和端口镜像、流镜像
查看>>
abstract class与interface的差异
查看>>
POJ-1007 DNA Sorting
查看>>
H3C交换机基本配置命令明细
查看>>
Heartbeat+DRBD+MFS高可用
查看>>
要感谢那些曾经慢待你的人
查看>>
常见的global cache等待事件
查看>>
第 7 章 多主机管理 - 047 - 管理 Machine
查看>>
CentOS5和6的系统启动流程
查看>>
怎么看域客户端是否继承了组策略
查看>>
linux防止DDoS***
查看>>
6.4 Linked List 重做
查看>>
小米路由
查看>>
QT 学习 之 窗口拖拽 实现
查看>>