前言
Swagger用来制作API文档十分方便,但是在项目分角色进行API鉴权时,如果事先没有对整个项目的API层级有很好的定义的时候(代码的分包比较混乱,一个controller中包含多个角色调用的接口),会显得整个API文档非常的臃肿,看起来很不方便。
这个问题,就被小编我遇到了。并且在网上浏览时,发现这方面的资料及其少,甚至说没有。。。万不得已,只能去撸一撸swagger的源码,并且源码也搞得我云里雾里的,但还是被我给找到了解决的方法,这里跟大家分享一下。
分析
重头分析下Swagger的配置类
这里着重看下,该配置类向Spring容器里注入Docket对象的配置,Docket其实就是配置API文档生成的参数。
说明:红框圈起来的就是生成API文档时,配置的请求处理选择器和路径选择器,这里用的是默认的Swagger为我们提供的选择器。
RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class):意思就是被ApiOperation注解标注的方法会被添加进来。
PathSelectors.any():意思就是不进行路径过滤,你选出来啥就是啥。
看到这里的时候,突然有了个想法,如果能自己写一个满足需求的选择器,不就解决了吗
接下来看下RequestHandlerSelectors是个啥
这里主要看RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)这个方法返回了一个什么东西?跟到源码里,发现其实很简单。
就这么一行代码,就判断了一个RequestHandler类型的入参是否被指定的注解标注。
再看下RequestHandler是个啥
点进源码查看时,发现里面有个参数很有意思HandlerMethod
看到这里,就想着,既然这是选择方法的,会不会就是将扫描出来的方法,封装了一下呢?
最后看下HandlerMethod是个啥
于是就再点进去看了下HandlerMethod的源码,发现一个Method对象的成员变量,截图如下:
看到这里还是还是有点不确定,于是,将项目用debug模式运行起来,在RequestHandlerSelectors里面打了个断点,想着来验证一下。
连续断点几次之后,发现这些method好眼熟啊,不就是我定义的接口吗?
分析结果
这个Method就是扫描出来的我们定义的方法对象,那我们拿到这个对象之后,不是想怎么判断就怎么判断吗?感觉要飞起来了。。。
Swagger给的这个默认的选择器里面,只是做了注解判断而已,我们完全可以进行自己的判断啊!!!
实现自定义的RequestHandler选择器