升级Springfox至2.8.0后Swagger资源访问路径错误如何解决?
解决Springfox 2.8.0中Swagger资源路径错误的问题
这个问题我之前帮同事排查过,是Springfox 2.8.0版本里Swagger UI的静态资源路径配置出了点小问题,给你几个靠谱的解决办法:
方法一:指定Swagger的基础路径
在你的Swagger配置类(标注了@EnableSwagger2的类)里,创建Docket实例时加上pathMapping配置,把它设为你的API前缀/api:
@Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.your.project.package")) .paths(PathSelectors.any()) .build() .pathMapping("/api"); // 这行是关键,修正基础请求路径 }
这个配置会让Swagger UI自动以/api作为所有资源请求的根路径,不会再错误地把swagger-ui.html拼接到资源路径里。
方法二:手动配置静态资源映射
如果方法一没生效,可能是Spring MVC的静态资源映射规则没处理好。你可以在实现WebMvcConfigurer的配置类里添加以下映射:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射Swagger UI页面 registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); // 映射Swagger UI依赖的webjars资源 registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); // 重点:确保swagger-resources的请求路径正确映射 registry.addResourceHandler("/api/swagger-resources/**") .addResourceLocations("classpath:/META-INF/resources/swagger-resources/"); }
这样Spring就能正确路由/api/swagger-resources/开头的请求到对应的静态资源文件,避免路径拼接错误。
方法三:排除Swagger路径的拦截/过滤
如果项目里有自定义的拦截器或过滤器,可能会修改请求路径导致问题。你需要确保这些组件排除Swagger相关的路径:
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(yourCustomInterceptor) .excludePathPatterns( "/api/swagger-ui.html", "/api/swagger-resources/**", "/api/webjars/**", "/api/v2/api-docs" ); }
如果是过滤器,也要类似地排除这些路径,避免它们干扰Swagger的资源请求。
额外建议
如果以上方法都没解决问题,可以尝试清理Maven/Gradle的依赖缓存,重新拉取Springfox的依赖包——有时候依赖包损坏也会导致这种奇怪的路径问题。
内容的提问来源于stack exchange,提问作者alexanoid




