今天又碰到了一个也很折磨人的问题:Knife4j 接口文档打不开

起因是,我在跟课程进度的时候,完成了新建员工的操作,需要进行接口测试。

课程里面使用的是Swagger,跟着课程敲下来,自信满满打开链接:

http://localhost:8080/doc.html#/home

结果就是显示Knife4j异常

就是我寻思直接postman应该也没事儿,摸索半天感觉还是没有课程里面的好用

一开始我以为只是代码没敲对,核对了一下PPT没问题。

那就可能是配置问题了,排查下来,发现根因在

Spring Boot、Spring Framework、springdoc、Knife4j 之间的版本兼容性

最开始日志里报的是这样一段警告:

WARN  PageNotFound : No mapping for GET /swagger-resources

WARN  PageNotFound : No endpoint GET /swagger-resources.

即:

Knife4j 前端页面去请求了 /swagger-resources,但后端并没有提供这个接口

/swagger-resources 这个地址,是早期 Swagger2 / Springfox 常见的接口路径。

而我当前项目其实已经是在 Spring Boot 3 环境下了,按理说应该走的是 OpenAPI3 体系,对应接口一般是:

/v3/api-docs

所以项目里很可能混入了旧版 Swagger2 的配置或依赖,导致 Knife4j 页面资源和后端实际文档接口不匹配。

按照以下方式操作:

1.查看pom.xml,把老依赖清掉:

springfox-swagger2
springfox-swagger-ui
springfox-boot-starter
knife4j-openapi2-spring-boot-starter

2.我的项目是 Boot 3,这些都容易导致前端资源和后端接口对不上。官方文档也特别提醒 Boot 3 要避免 jar 冲突。

改好之后又出现了新的报错,我真的是……
心态要爆炸了,被这些问题困住一晚上

(此处反复调整心态,挣扎0.5h…)

说明现在项目里用了 Spring Framework 6.2.0,但 springdoc-openapi 2.3.0 仍然在调用一个旧的 ControllerAdviceBean(Object) 构造方法;而 Spring 6.2 这一侧已经不再按这个方式兼容,所以访问 /v3/api-docs 时直接炸掉。这个问题在 springdoc 官方 issue 里有明确记录,且被认为和 Spring 6.2 / Boot 3.5.x 的兼容性有关。

实在没招了,考虑到万一以后又遇到版本不兼容的问题

我还是把springboot版本降低到比较稳定的版本吧

(这一次的根源还得从一开始选择了默认的比较新的SpringBoot的版本说起。。。)

终于!!!!!!!!

哦对了,像这种成熟的项目,代码肯定是没问题的,出问题肯定就说版本依赖相关的,建议大家耐心一点,查一查官方说明还有社区讨论。如果你不想查也可以用AI帮忙查一查原因。

附上我使用版本号:

Spring Boot 3.2.5

Spring Framework 6.1.x

Knife4j 4.4.0

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐