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 注解
参考资料:
原文地址:https://www.cnblogs.com/farpig/p/15135112.html
- 服务器未能识别 HTTP 标头 SOAPAction 的值
- 实用代码-C#获取本机网络适配器信息及MAC地址
- WordPress 自定义 login (登录页面)CSS 样式
- [C#1] 12-特性
- HTTP Basic Authentication for RESTFul Service
- [C#2] 4-可空类型、静态类
- jquery 操作css 尺寸
- Windows 7上IIS出现http 500错误
- [C#2] 2-匿名方法
- jquery 操作css 选择器
- 主页后台源码及释义
- [C#2] 3-局部类型、属性访问器保护级别、命名空间别名限定符
- (2013.09更新)最新W3School 离线完整版CHM 电子书下载
- [C#2] 1-泛型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值
- JavaScript 启动性能瓶颈分析与解决方案
- 大白话理解Vuex
- 【Java面试总结】计算机网络
- volatile关键字 Krains 2020-08-26
- synchronized关键字 Krains 2020-08-25
- happens-before Krains 2020-08-26
- ReentrantLock可重入锁 Krains 2020-08-27
- Java中的线程 Krains 2020-08-24
- CAS Krains 2020-08-25
- 96. 不同的二叉搜索树 II Krains 2020-09-03 树
- 410. 分割数组的最大值 Krains 2020-08-29 20:21:39 动态规划二分查找
- 字典树 Krains 2020-09-01
- redis学习(十)
- vue修改浏览器的标题title