SpringBoot整合Swagger(三)apis()介面掃描 | Java隨筆記

語言: CN / TW / HK

「這是我參與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