SpringBoot集成Swagger(三)apis()接口扫描 | Java随笔记

5,361 阅读2分钟

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


相关文章

Java随笔记:Java随笔记


前言

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

select()配置扫描接口

  • 前面说过,Docket是链式调用的。

  • 使用select()必须build()

  • 先举个例子再来讲里面的东西吧。

    •     @Bean
          public Docket docket(){
              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo())
                      .select()
                      .apis(RequestHandlerSelectors.none())
                      .build();
          }
      
  • 启动看一看

    • image-20211110214357478.png
    • 啊呦!啥都木有了。
  • 这时候我们可以看看,这个apis()里的参数RequestHandlerSelectors里面的是啥?

    • image-20211110214606291.png

    • 重点方法已框出。

      • 当我们设置为 RequestHandlerSelectors.none()时,不扫描任何接口。

      • 当我们设置为 RequestHandlerSelectors.any()时,扫描所有接口。

      • 当我们设置为 RequestHandlerSelectors.basePackage("需要扫描的包路径")

        •     @Bean
              public Docket docket(){
                  return new Docket(DocumentationType.SWAGGER_2)
                          .apiInfo(apiInfo())
                          .select()
                          .apis(RequestHandlerSelectors.basePackage("com.dayu.dyswagger.dycontroller"))
                          .build();
              }
          
        • image-20211110215044916.png
      • 这样我们就可以指定扫描,哪些接口需要展示,哪些接口不需要展示。

      • 这时候可能有的同学要问了:那假如我需要匹配多个包下的controller该怎么办嘞?

        • 要么使用path来,要么使用withClassAnnotation。path下面再讲。这里我们讲解下如何使用withClassAnnotation
        • 很明显可以看出,这是指定注解的。
        • 那我们可以先想象一下:设定所有加了 @RestController注解的类都能被扫描到?或者我们自己写个注解,加到我们需要被扫描的Controller上不也是可以的嘛?下面演示一波~
      • 扫描指定注解:

        •     @Bean
              public Docket docket(){
                  return new Docket(DocumentationType.SWAGGER_2)
                          .apiInfo(apiInfo())
                          .select()
                          .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                          .build();
              }
          
        • image-20211110220124922.png
        • image-20211110220140501.png
        • 成功!!但是这种方式也不是特别灵活对吧?因为这些原有注解就是我们常用的,不可能避免某一个类不加。
      • 自定义注解

        • /**
           * @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
        •     @Bean
              public Docket docket(){
                  return new Docket(DocumentationType.SWAGGER_2)
                          .apiInfo(apiInfo())
                          .select()
                          .apis(RequestHandlerSelectors.withClassAnnotation(StartSwaggerScan.class))
                          .build();
              }
          
        • 运行看结果

          • image-20211110220623739.png
        • 完美符合要求!

      • 这种方式相对来说比较灵活!想怎么玩就怎么玩!哈哈哈!

    • 总结一下:

      • any() // 扫描所有,项目中的所有接口都会被扫描到
      • none() // 不扫描接口
      • 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求
      • 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口
      • basePackage(final String basePackage) // 根据包路径扫描接口

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

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