You need to enable JavaScript to run this app. Spring Boot 2.4 自定义WebMvcConfigurer后静态资源访问404
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.4 自定义WebMvcConfigurer后静态资源访问404

问题根因

你配置自定义静态资源规则后出现404,核心是路径配置不符合Spring的资源定位拼接规则:

  • 配置的类路径缺少末尾必带的斜杠。Spring拼接静态资源的实际定位路径时,不会自动补充路径分隔符,会将匹配的请求路径片段直接拼接到配置的资源位置字符串之后。你原来写的classpath:/static没有末尾斜杠,遇到/res/css/test.css这类请求,最终拼接出的定位路径会变成classpath:/staticres/css/test.css,完全指向不存在的目录,自然无法找到资源返回404。
  • 未校验路径匹配逻辑和文件存储位置的对应关系,忽略了路径拼接的边界要求。
调整后的正确配置
@Configuration
public class CacheStaticResourcesConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/favicon.ico", "/res/**", "/images/**")
                // 补充末尾斜杠,保证路径拼接逻辑正确
                .addResourceLocations("classpath:/static/")
                .setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS)
                        .noTransform()
                        .mustRevalidate());
    }
}
两个核心方法的协同逻辑
  • addResourceHandler():定义需要被静态资源处理器拦截的URL匹配规则,告诉Spring MVC哪些进入应用的请求要走静态资源查找逻辑,而非普通控制器映射流程。
  • addResourceLocations():定义静态资源实际的存放位置,配置的路径必须以斜杠收尾。当请求匹配到前面的规则后,Spring会把请求URL中超出匹配规则前缀的剩余部分,直接拼接到资源位置字符串后,定位到真实存在的文件。

举个实际匹配示例:

  • 正确配置下,请求路径/images/banner.png会被规则/images/**匹配,拼接后定位到classpath:/static/images/banner.png,和你本地的目录结构完全对应。
  • 错误配置下,同样的请求会被拼接成classpath:/staticimages/banner.png,无对应文件直接返回404。
补充注意点
  • Spring Boot内置的默认静态资源配置,所有路径都是带末尾斜杠的,对应的值为classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,配置自定义规则时要和默认规则保持一致的路径格式。
  • 如果需要覆盖全量的静态资源映射,而非仅当前列出的三个路径,可以将资源处理器的匹配规则改为/**,同时按顺序传入所有需要扫描的类路径位置,保证和Spring Boot默认的扫描范围一致,避免遗漏其他目录下的静态资源。

内容的提问来源于stack exchange,提问作者phip1611

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 17:36:03