You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:46