Spring Boot 2.0集成Swagger出现404错误,求解决方案
我之前也碰到过几乎一模一样的情况,结合Spring Boot 2.x的特性和Springfox的配置要点,给你几个可行的解决方案:
1. 手动配置Swagger静态资源映射
Spring Boot 2.x对静态资源的处理逻辑有调整,Swagger UI的静态文件默认不会自动适配你自定义的context-path,需要手动添加资源映射规则:
创建一个WebMvc配置类,添加Swagger相关资源的映射:
@Configuration public class SwaggerResourceConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射Swagger UI的核心HTML文件 registry.addResourceHandler("/swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); // 映射Swagger UI依赖的webjar静态资源 registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
2. 调整Swagger Docket的路径映射
因为你设置了server.servlet.contextPath=/cat-service,需要在Swagger的Docket配置中明确指定路径映射,确保生成的API文档路径和实际请求路径匹配:
修改你的SwaggerConfig:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() // 建议指定你的Controller所在包,避免扫描无关类(比any()更精准) .apis(RequestHandlerSelectors.basePackage("com.yourproject.controller")) .paths(PathSelectors.any()) .build() // 绑定你的项目context-path .pathMapping("/cat-service"); } }
3. 修正访问路径
你之前的API文档路径多了一层冗余的/api,正确的访问路径应该是:
- API文档:
http://localhost:8080/cat-service/v2/api-docs - Swagger UI页面:
http://localhost:8080/cat-service/swagger-ui.html
4. 升级Springfox版本(可选优化)
Springfox 2.8.0对Spring Boot 2.0.x的支持存在一些小兼容性问题,你可以尝试升级到更稳定的2.9.2版本,修改pom.xml中的依赖:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
5. 检查启动类的包扫描范围
确保你的SwaggerConfig和SwaggerResourceConfig在Spring Boot启动类的扫描范围内(比如和启动类同包或子包),如果不在,需要在启动类上添加@ComponentScan(basePackages = {"com.yourproject.config", "com.yourproject.controller"})指定扫描路径。
另外提一句:你配置文件里的management.server.servlet.context-path是用于Spring Boot Actuator监控的,和Swagger无关,不需要为了Swagger调整它。
按照以上步骤调整后,应该就能正常访问Swagger的页面和API文档了。
内容的提问来源于stack exchange,提问作者riorio

