問題
今天調試接口時,發現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 注解
參考資料: