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
相关产品推荐
相关产品推荐

