SpringBoot集成Swagger(三)apis()接口

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战


相关文章

Java随笔记:Java随笔记


前言

  • 小伙伴们,前面一直在讲文档信息的配置,大家有木有想过,为啥我们的Swagger上面连basic-error-controller都会被扫描出来?
  • 下面我们一起来看看是为啥

select()配置扫描接口

  • 前面说过,Docket是链式调用的。
  • 使用select()必须build()
  • 先举个例子再来讲里面的东西吧。
+ 
1
2
3
4
5
6
7
8
scss复制代码    @Bean
   public Docket docket(){
       return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(apiInfo())
              .select()
              .apis(RequestHandlerSelectors.none())
              .build();
  }
  • 启动看一看
+ ![image-20211110214357478.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/0c9bfab3bb9cfd58c7e88209d9aeeef2e576aa14762b54eeb76954585e7d6461)
+ 啊呦!啥都木有了。
  • 这时候我们可以看看,这个apis()里的参数RequestHandlerSelectors里面的是啥?
+ ![image-20211110214606291.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/9858b5a6d0578e568dba9264e63256c2f8ff377ab13cedf589420943be987c1b)
+ 重点方法已框出。


    - 当我们设置为 `RequestHandlerSelectors.none()`时,不扫描任何接口。
    - 当我们设置为 `RequestHandlerSelectors.any()`时,扫描所有接口。
    - 当我们设置为 `RequestHandlerSelectors.basePackage("需要扫描的包路径")`时


        * 
1
2
3
4
5
6
7
8
scss复制代码    @Bean
   public Docket docket(){
       return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(apiInfo())
              .select()
              .apis(RequestHandlerSelectors.basePackage("com.dayu.dyswagger.dycontroller"))
              .build();
  }
* ![image-20211110215044916.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/62f59f56955f87a4f5abd2bb16119b5ba149ec88396430b3fc060edb23410280) - 这样我们就可以指定扫描,哪些接口需要展示,哪些接口不需要展示。 - 这时候可能有的同学要问了:那假如我需要匹配多个包下的`controller`该怎么办嘞? * 要么使用`path`来,要么使用`withClassAnnotation`。path下面再讲。这里我们讲解下如何使用withClassAnnotation * * 很明显可以看出,这是指定`注解`的。 * 那我们可以先想象一下:设定所有加了 `@RestController`注解的类都能被扫描到?或者我们自己写个注解,加到我们需要被扫描的Controller上不也是可以的嘛?下面演示一波~ - 扫描指定注解: *
1
2
3
4
5
6
7
8
scss复制代码    @Bean
  public Docket docket(){
      return new Docket(DocumentationType.SWAGGER_2)
               .apiInfo(apiInfo())
               .select()
               .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
               .build();
   }
* ![image-20211110220124922.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/1095669b712a16067175cae1b9cb03ce32a71462c9998ceaae6ec82cd9d745fd) * ![image-20211110220140501.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/aba2cc0370035cb2ba6394f0dbd1348fa92a52d71b81b1caae2d0a6b1b6a3400) * 成功!!但是这种方式也不是特别灵活对吧?因为这些原有注解就是我们常用的,不可能避免某一个类不加。 - 自定义注解 *
1
2
3
4
5
6
7
8
9
10
11
less复制代码/**
* @program: dyswagger
* @description: Swagger扫描注解
* @author: DingYongJun
* @create: 2021-11-10 22:03
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
@Inherited
public @interface StartSwaggerScan {
}
* 需要被扫描到的类上加上 `@StartSwaggerScan`即可 + ![image-20211110220556345.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/0275bb19780dde8b3e64d9418e25406a9c545daa0f44f1e5e9ccc3631794abe2) *
1
2
3
4
5
6
7
8
scss复制代码    @Bean
   public Docket docket(){
       return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(apiInfo())
              .select()
              .apis(RequestHandlerSelectors.withClassAnnotation(StartSwaggerScan.class))
              .build();
  }
* 运行看结果 + ![image-20211110220623739.png](https://gitee.com/songjianzaina/juejin_p9/raw/master/img/b639ec7511f38f19374af23b2f6e77e65fd57fcf4e6f0168851ba1489b9d02bb) * 完美符合要求! - 这种方式相对来说比较灵活!想怎么玩就怎么玩!哈哈哈! + 总结一下: - any() // 扫描所有,项目中的所有接口都会被扫描到 - none() // 不扫描接口 - 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求 - 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口 - basePackage(final String basePackage) // 根据包路径扫描接口

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%