
Spring Boot 2.7.x 中使用 Springfox 2.9.2 时,Swagger UI 访问路径(如 /swagger-ui.html)返回 404,根本原因是静态资源未正确注册;需显式配置 ResourceHandler 并继承 WebMvcConfigurerAdapter(Spring Boot 2.x 兼容方案)。
spring boot 2.7.x 中使用 springfox 2.9.2 时,swagger ui 访问路径(如 `/swagger-ui.html`)返回 404,根本原因是静态资源未正确注册;需显式配置 `resourcehandler` 并继承 `webmvcconfigureradapter`(spring boot 2.x 兼容方案)。
在 Spring Boot 2.7.10 环境下,即使引入了 springfox-swagger-ui 依赖,Swagger UI 的前端资源(HTML、JS、CSS)仍不会自动暴露——因为 Spring Boot 2.x 默认禁用了传统 WebMvc 静态资源映射逻辑,而 Springfox 2.x(尤其是 2.9.2)尚未完全适配 Spring Boot 2.x 的 WebMvcConfigurer 新机制。因此,仅添加 @EnableSwagger2 和 Docket Bean 是不够的,必须手动注册 Swagger UI 所需的静态资源路径。
✅ 正确配置步骤
1. 保留兼容性依赖(适用于 Spring Boot 2.7.x)
你的 build.gradle 中依赖组合基本正确,但需注意:
- springfox-swagger2:2.9.2 与 springfox-swagger-ui:2.9.2 必须版本严格一致;
- 不要混用 springdoc-openapi(那是 Spring Boot 3+ 的现代替代方案);
- @EnableWebMvc 会关闭 Spring Boot 的默认 MVC 配置,因此必须自行补全所有资源处理逻辑(包括 Swagger UI + WebJars)。
2. 修正 SwaggerConfig.java
关键修改点如下:
package com.company.app.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; // ? 推荐使用接口(Spring 5.0+)
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
// ⚠️ 注意:Spring Boot 2.7 已弃用 WebMvcConfigurerAdapter(已标记为 @Deprecated)
// 改用实现 WebMvcConfigurer 接口(更符合当前最佳实践)
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.company")) // 扫描你的 Controller 包
.paths(PathSelectors.any()) // ? 建议设为 any() 或合理路径规则,避免遗漏
.build();
}
// ✅ 必须重写:注册 Swagger UI 静态资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 映射 swagger-ui.html 到 classpath:/META-INF/resources/
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 映射 webjars(Swagger UI 依赖的 JS/CSS 库)
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
? 为什么是 /swagger-ui.html?
Springfox 2.9.2 默认入口页为 swagger-ui.html(而非 /swagger-ui/),访问地址应为:
http://localhost:8080/swagger-ui.html
✅ 确保 URL 后缀 .html 存在且无多余斜杠。
3. 验证控制器是否被扫描
确保你的 REST 控roller 类位于 com.company 或其子包下,并使用了 @RestController 或 @RequestMapping 注解。例如:
@RestController
@RequestMapping("/api/v1")
public class UserController {
@GetMapping("/users")
public List<string> listUsers() {
return Arrays.asList("Alice", "Bob");
}
}</string>
⚠️ 注意事项与常见陷阱
- ❌ 不要同时启用 @EnableWebMvc 和 WebMvcConfigurer 实现——@EnableWebMvc 会覆盖 Spring Boot 自动配置,此时你必须自行注册所有资源处理器(包括 favicon、静态资源等),否则可能影响其他静态文件访问;
- ✅ 若无需完全接管 MVC 配置,建议移除 @EnableWebMvc(它不是 Swagger 所必需),仅保留 @Configuration + WebMvcConfigurer 实现即可;
- ? 路径匹配建议:PathSelectors.any() 比 ant("/api/**") 更稳妥,避免因路径前缀不一致导致 API 未被纳入文档;
- ? 清理缓存:修改配置后,重启应用并硬刷新浏览器(Ctrl+F5),避免旧版 Swagger 缓存干扰;
- ? 检查 JAR 包内容:确认 springfox-swagger-ui-2.9.2.jar 内含 META-INF/resources/swagger-ui.html 及 webjars/ 资源(可通过解压验证)。
✅ 最终访问方式
启动应用后,打开浏览器访问:
? http://localhost:8080/swagger-ui.html
若一切配置正确,将看到 Swagger UI 界面,并自动加载 /v2/api-docs 提供的 OpenAPI 规范。
? 升级建议(长期维护视角):
Springfox 2.x 已停止维护(last release: 2020),官方推荐迁移到 springdoc-openapi(支持 Spring Boot 2.6+ / 3.x,零配置、响应式友好、Active Swagger UI 4.x)。迁移只需替换依赖 + 删除配置类,大幅降低维护成本。











