「这是我参与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(); }
-
-
启动看一看
- 啊呦!啥都木有了。
-
这时候我们可以看看,这个
apis()
里的参数RequestHandlerSelectors
里面的是啥?-
-
重点方法已框出。
-
当我们设置为
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(); }
-
-
这样我们就可以指定扫描,哪些接口需要展示,哪些接口不需要展示。
-
这时候可能有的同学要问了:那假如我需要匹配多个包下的
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(); }
- 成功!!但是这种方式也不是特别灵活对吧?因为这些原有注解就是我们常用的,不可能避免某一个类不加。
-
-
自定义注解
-
/** * @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
即可 -
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.withClassAnnotation(StartSwaggerScan.class)) .build(); }
-
运行看结果
-
完美符合要求!
-
-
这种方式相对来说比较灵活!想怎么玩就怎么玩!哈哈哈!
-
-
总结一下:
- any() // 扫描所有,项目中的所有接口都会被扫描到
- none() // 不扫描接口
- 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求
- 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口
- basePackage(final String basePackage) // 根据包路径扫描接口
-
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah