spring-boot 4 静态资源访问问题

Spring Boot 4.0.1 中静态资源映射功能并没有被移除WebMvcConfigurer.addResourceHandlers() 和配置文件方式都仍然可用。但如果你遇到了静态资源404的问题,大概率是以下几个原因导致的:


一、最常见原因:@EnableWebMvc 导致自动配置全部退出

这是 Spring Boot 4 中最高频的踩坑点。一旦你的配置类上加了 @EnableWebMvcWebMvcAutoConfiguration全面退出,包括静态资源处理器(ResourceHandlerRegistration)、内容协商等默认注册全部消失

错误写法:

@EnableWebMvc  // ← 这个注解会禁用所有默认配置!
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    // 你的自定义配置...
}

正确写法:

@Configuration  // ← 只用 @Configuration,不加 @EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    // 你的自定义配置会与默认配置合并
}

二、重写了 addResourceHandlers 但未保留默认路径

当你实现 WebMvcConfigurer 并重写 addResourceHandlers() 时,默认的资源处理器不会自动保留,需要手动恢复:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 1. 恢复默认静态资源路径(必须手动添加)
        registry.addResourceHandler("/**")
                .addResourceLocations(
                    "classpath:/META-INF/resources/",
                    "classpath:/resources/",
                    "classpath:/static/",
                    "classpath:/public/"
                );

        // 2. 你的自定义路径
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:/opt/uploads/");
    }
}

三、配置类未被扫描到

Spring Boot 4 中 Bean 排序更加刚性化,多个 WebMvcConfigurer 实例按 @Order 升序执行,未标注 @Order 的默认为 Ordered.LOWEST_PRECEDENCE(最后执行),极易被前置配置覆盖。

建议显式指定优先级:

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebConfig implements WebMvcConfigurer {
    // ...
}

四、配置文件方式仍然有效

如果不想写 Java 配置类,application.yml 方式在 Spring Boot 4 中依然正常工作:

spring:
  web:
    resources:
      static-locations:
        - classpath:/static/
        - classpath:/public/
        - file:/opt/uploads/
  mvc:
    static-path-pattern: /**

五、诊断步骤

如果以上都排除了还是404,可以通过以下方式排查:

  1. 检查自动配置是否生效:访问 http://localhost:8080/actuator/mappings,确认是否存在 resourceHandler 映射
  2. 开启调试日志
    logging:
      level:
        org.springframework.web.servlet.resource: DEBUG
    
    观察日志中是否出现 ResourceHttpRequestHandler: Looking for resource... 的记录
  3. 检查 @ComponentScan:确保配置类所在包被启动类扫描到

总结

问题 原因 解决方案
静态资源全部404 加了 @EnableWebMvc 删除 @EnableWebMvc
部分资源404 重写 addResourceHandlers 未保留默认路径 手动添加默认路径
配置不生效 配置类未被扫描或优先级过低 检查包扫描 + 加 @Order

静态资源映射在 Spring Boot 4.0.1 中完全可用,只是配置上的"坑"比之前版本更多了,核心原则是:不要加 @EnableWebMvc,用 @Configuration 即可


需要我帮你整理一份 Spring Boot 4.0 中 WebMvcConfigurer 的完整配置示例吗?包含静态资源、跨域、拦截器的组合写法,可以直接复制使用。

posted @ 2026-07-22 11:54  涣明  阅读(2)  评论(0)    收藏  举报