前面在使用Swagger2时遇到的坑中简单介绍了Swagger的使用。

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

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

实现方法

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

  1. @Configuration
  2. @EnableSwagger2
  3. public class Swagger2Config {
  4. @Bean
  5. public Docket buildDocket() {
  6. return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
  7. .apis(RequestHandlerSelectors.basePackage("com.yejg")).paths(PathSelectors.any()).build();
  8. }
  9. private ApiInfo apiInfo() {
  10. return new ApiInfoBuilder().title("接口文档").description("描述文字...").termsOfServiceUrl("https://yejg.top").version("V1.0").build();
  11. }
  12. }

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

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

优化方案

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

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

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

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

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

  1. public static Predicate<RequestHandler> basePackage(final String basePackage) {
  2. return new Predicate<RequestHandler>() {
  3. @Override
  4. public boolean apply(RequestHandler input) {
  5. return declaringClass(input).transform(handlerPackage(basePackage)).or(true);
  6. }
  7. };
  8. }
  9. private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
  10. return new Function<Class<?>, Boolean>() {
  11. @Override
  12. public Boolean apply(Class<?> input) {
  13. return input.getPackage().getName().startsWith(basePackage);
  14. }
  15. };
  16. }

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

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

实现代码如下:

  1. @Configuration
  2. @EnableSwagger2
  3. public class Swagger2Config {
  4. // 定义分隔符
  5. private static final String SEPARATOR = ",";
  6. @Bean
  7. public Docket buildDocket() {
  8. return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
  9. .apis(basePackage("com.yejg" + SEPARATOR + "com.springXXX"))
  10. .paths(PathSelectors.any()).build();
  11. }
  12. private ApiInfo apiInfo() {
  13. return new ApiInfoBuilder().title("接口文档").description("描述文字...")
  14. .termsOfServiceUrl("https://yejg.top").version("V1.0").build();
  15. }
  16. /**
  17. * @param basePackage
  18. * @return
  19. * @see RequestHandlerSelectors#basePackage(String)
  20. */
  21. public static Predicate<RequestHandler> basePackage(final String basePackage) {
  22. return new Predicate<RequestHandler>() {
  23. @Override
  24. public boolean apply(RequestHandler input) {
  25. return declaringClass(input).transform(handlerPackage(basePackage)).or(true);
  26. }
  27. };
  28. }
  29. private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
  30. return input -> {
  31. // 循环判断匹配
  32. for (String strPackage : basePackage.split(SEPARATOR)) {
  33. boolean isMatch = input.getPackage().getName().startsWith(strPackage);
  34. if (isMatch) {
  35. return true;
  36. }
  37. }
  38. return false;
  39. };
  40. }
  41. private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
  42. return Optional.fromNullable(input.declaringClass());
  43. }
  44. }

Swagger2限定接口范围的更多相关文章

  1. swagger2的接口文档

    以前见过一个swagger2的接口文档,特别好用,好看,对接口中入参描述的很详细:适合用于项目的开发 后来自己做项目的时候,没有找到这个swagger版本 <dependency> < ...

  2. (五)整合 Swagger2 ,构建接口管理界面

    整合 Swagger2 ,构建接口管理界面 1.Swagger2简介 1.1 Swagger2优点 1.2 Swagger2常用注解 2.SpringBoot整合Swagger2 2.1 Swagee ...

  3. 【工具】Swagger2写接口注释

    一.遇到的问题 作为一名coder,经常需要向别人提供接口,或者调用别人的接口.于是就有了接口参数是什么意思,要怎么传参数,返回值是什么意思……有多少调用方,就会有多少人来询问这些参数.如果是长时间之 ...

  4. Spring Cloud之Swagger2 API接口管理

    随着微服务架构体系的发展和应用, 为了前后端能够更好的集成与对接,同时为了项目的方便交付,每个项目都需要提供相应的API文档. 来源:PC端.微信端.H5端.移动端(安卓和IOS端) 传统的API文档 ...

  5. SpringBoot2.0 整合 Swagger2 ,构建接口管理界面

    一.Swagger2简介 1.Swagger2优点 整合到Spring Boot中,构建强大RESTful API文档.省去接口文档管理工作,修改代码,自动更新,Swagger2也提供了强大的页面测试 ...

  6. Springboot+swagger2的接口文档开发

    一.创建一个SpringBoot项目 1. 2. 3. 4. 把web里的web选中,SQL里选择自己需要的,点击next 二.创建各项所需的controller,configure等 1. 项目布局 ...

  7. Springboot集成swagger2生成接口文档

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11509884.html    作者:jstarseven    码字挺辛苦的.....   一 ...

  8. SpringFox swagger2 and SpringFox swagger2 UI 接口文档生成与查看

    依赖: <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency ...

  9. SpringBoot 使用Swagger2打造在线接口文档(附汉化教程)

    原文地址: https://www.jianshu.com/p/7e543f0f0bd8 SpringBoot + Swagger2 UI界面-汉化教程 1.默认的英文界面UI 想必很多小伙伴都曾经使 ...

随机推荐

  1. java.security.SecureRandom源码分析 java.security.egd=file:/dev/./urandom

    SecureRandom在java各种组件中使用广泛,可以可靠的产生随机数.但在大量产生随机数的场景下,性能会较低. 这时可以使用"-Djava.security.egd=file:/dev ...

  2. _ZNote_Qt_定时器的总结

    Qt中实现定时器有两种方法. 一种是使用QObject类定时器;一种是使用QTimer类定时器.(定时器的精度依赖于操作系统和硬件,大多数平台支持20ms) 1,QObject类定时器. 通过QObj ...

  3. 21.ArrayList

    ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来 ...

  4. The First BoKe

    A.如何看待师生关系 说起师生关系,我们每个人都有不同的见解,但无一例外,师者,传道授业解惑也,老师的为学生传授的才能知识,是学生今后发展的宝贵财富,无论是从哪方面,都可以对学生起着积极向上的作用.而 ...

  5. 单源最短路径算法——Bellman-ford算法和Dijkstra算法

     BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V ...

  6. Mybatis延迟加载、缓存

    一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多 ...

  7. maya2015卸载/安装失败/如何彻底卸载清除干净maya2015注册表和文件的方法

    maya2015提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2015失败提示maya2015安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  8. Linux pwn入门教程(6)——格式化字符串漏洞

    作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...

  9. CTFcrackTools-V3 - 一款旨在帮助 CTFer 在 CTF 中发挥作用的一个框架

    CTFcrackTools-V3 CTFcrackTools重置版 作者:米斯特安全-林晨.摇摆.奶权 米斯特安全团队首页:http://www.hi-ourlife.com/ 部分插件来源:希望团队 ...

  10. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...