Springfox v2.7.0中Swagger-UI访问swagger-resources报404求助
问题分析
你的核心问题是Swagger UI页面的部署路径与Swagger资源的路径不匹配:
- Swagger UI页面在根路径
/mywebservices/swagger-ui.html,它默认会从当前页面的相对路径(即/mywebservices/)请求swagger-resources,但你的实际资源都挂载在/mywebservices/v2/下,所以返回404并触发Base URL输入弹窗。
下面是几个针对性的解决方案,你可以根据自己的需求选择:
方案1:将Swagger UI映射到/v2路径下(推荐)
这个方案让UI页面和Swagger资源处于同一路径下,最符合你的预期。需要在v2版本的Spring配置类(com.test.mywebservices.v2.config.WebConfig)中添加资源映射规则:
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射swagger-ui.html到/v2路径下 registry.addResourceHandler("/v2/swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/swagger-ui.html"); // 映射webjars资源(springfox.js等)到/v2/webjars/路径下 registry.addResourceHandler("/v2/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
配置完成后,你就可以通过 https://localhost:9002/mywebservices/v2/swagger-ui.html 访问Swagger UI,此时页面会自动向 /mywebservices/v2/swagger-resources 请求资源,完全匹配你的现有资源路径,不会再出现404问题。
方案2:修改Swagger配置指定Base路径(保留原UI访问路径)
如果你希望继续通过 https://localhost:9002/mywebservices/swagger-ui.html 访问UI,可以在v2的Swagger配置类中强制指定资源的Base路径:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.test.mywebservices.v2")) .paths(PathSelectors.any()) .build() // 指定API的Base路径,让Swagger资源生成正确的URL .pathMapping("/v2"); } // 修正swagger-resources中api-docs的URL指向 @Bean public SwaggerResourcesProvider swaggerResourcesProvider(InMemorySwaggerResourcesProvider defaultProvider) { return () -> { List<SwaggerResource> resources = defaultProvider.get(); resources.forEach(resource -> resource.setUrl("/mywebservices/v2/v2/api-docs")); return resources; }; } }
另外,也可以通过URL参数临时指定Base路径:访问 https://localhost:9002/mywebservices/swagger-ui.html?baseUrl=/mywebservices/v2,这样UI会自动从指定路径加载资源,无需修改代码。
方案3:通过web.xml添加资源Servlet映射(纯XML配置)
如果你更倾向于通过web.xml配置而不是Java代码,可以添加一个专门处理Swagger UI资源的Servlet,映射到/v2/*路径:
<servlet> <servlet-name>swagger-ui-resource</servlet-name> <servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>swagger-ui-resource</servlet-name> <url-pattern>/v2/swagger-ui.html</url-pattern> <url-pattern>/v2/webjars/*</url-pattern> </servlet-mapping>
这个配置会让/v2/swagger-ui.html和/v2/webjars/**路径的请求被Spring的资源Servlet处理,从而正确加载UI页面,并且请求相对路径的资源。
内容的提问来源于stack exchange,提问作者Pushpak U

