swagger 提示 'Unable to find specification for group default'
问题
今天调试接口时,发现swagger无法加载出来数据,因为用的是 knife4j 进行的集成,表现为请求数据接口 404 :
后台日志报警告信息 Unable to find specification for group default
但是其他模块正常
解决
找直接根源
既然有告警信息,那就好办了,我们先在idea中全局搜索这个报错信息,发现这个报错信息来自 springfox.documentation.swagger2.web.Swagger2ControllerWebMvc
这个类,
从名称面来看,应该是一个接口类,然后找到了对应的方法 getDocumentation()
我们debug看下:
可以看到获取到的值为 null
,而 DocumentationCache
这个对象呢,网上搜索到的信息显示,这个对象中,保存的是文档信息的缓存,所以很明显,这里没有找到任何数据
分析 DocumentationCache
既然 DocumentationCache 正常情况下,应该是有数据的,那我们就看看,什么时候这个对象会被加载数据,又在网上搜索了下,发现是由 DocumentationPluginsBootstrapper
这个类进行加载的
由文档加载器DocumentationPluginsBootstrapper进行加载,类实现了SmartLifecycle接口,当spring加载完bean后,调用start()方法进行加载。
而start()方法,又调用了父类的 bootstrapDocumentationPlugins() 方法
看下这个方法做了什么事情
从代码可以看到会调用到另外的方法 scanDocumentation()
此时,我们在这个地方打点断,然后重新启动,跟着断点一步一步的往下走
到这个地方的时候,我们发现,捕获到了一个异常
打开异常信息,可以看到这句话:
结果
看到这句话,我恍然大悟,是刚刚写的接口用的注解出错了
关键就在于 @RequestParam 这个注解
点进去看源码,我们可以看到这个注解的 value 与 name 属性,是互为别名的,而我写的时候写错了,勿把 name 属性当成注释用了
实际如果我想在 swagger 文档中给参数加个说明的话,我应该使用 @ApiParam 注解
参考资料: