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