問題
knife4j在復制具體接口地址時會在尾部追加“UsingPOST(GET..)_x”,x為不固定數(shù)值茁裙,所以會存在下一次訪問時訪問不到具體接口的情況。
實際地址
排查問題
- UsingPOST_x是從哪里來的势誊?
-
前端通過ajax請求后端的/v2/api-docs呜达,獲取具體接口信息谣蠢,(當然查看網(wǎng)絡(luò)請求也可得知)
app.js -
并且在v2/api-docs中查看到有"operationId":"infoUsingPOST_1"字段粟耻。同時在源碼中有如下代碼查近,所以可以判斷地址欄映射到的地址為/v2/api-docs參數(shù)拼接而來的
Knife4j_204.js.png
-
- infoUsingPOST_1在v2/api-docs中是怎么生成的?
- 先去除掉knife4j挤忙,訪問localhost:8080/v2/api-docs發(fā)現(xiàn)仍可以訪問霜威,得知knife4j是基于swagger提供的api文檔進行渲染
-
找到Swagger框架提供的Controller,通過debug找到operationId構(gòu)造的方法
OperationBuilder.png -
具體構(gòu)造operationId方法:通過map自增重復的mapping
CachingOperationNameGenerator.png
- 重寫startWith實現(xiàn)方法
- 方案一:由于開啟了
spring.main.allow-bean-definition-overriding: true
配置册烈,所以可以直接復制springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator
類到項目中戈泼,放到相同包下面,在bean加載時會先加載外部擴展jar赏僧,當加載到應(yīng)用程序中的bean時大猛,會覆蓋掉擴展jar中的bean -
方案二:繼承CachingOperationNameGenerator類,通過實現(xiàn)BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()淀零,棄用jar中的bean(cachingOperationNameGenerator)挽绩,將新的bean注冊到容器中
SwaggerBeanRegistry.png
SwaggerOperationNameGenerator.png
- 方案一:由于開啟了
但是,如果operationId重復驾中,點擊某一個接口會自動跳轉(zhuǎn)到同名接口唉堪,所以將operationId實現(xiàn)邏輯調(diào)整
ApiOperationReader.png
DefaultOperationReader.png
SwaggerBeanRegistry.png