1. 程式人生 > 其它 >swagger 提示 'Unable to find specification for group default'

swagger 提示 'Unable to find specification for group default'

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://blog.csdn.net/lvzhyt/article/details/117027177