Spring MVC静态资源配置异常:请求/resources/index.html返回404
Spring MVC 6.0.9 静态资源404问题排查与解决
一、Servlet规范版本不兼容(核心问题)
你当前web.xml使用的是Servlet 2.3的DTD,而Spring 6.0要求Servlet 5.0及以上(基于Jakarta EE 9+)。老版本Servlet规范会导致Spring MVC的资源处理逻辑无法正常工作,这是最可能引发404的原因。
解决办法:
将web.xml的DOCTYPE和根标签替换为Servlet 5.0版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- 原有配置内容保留 --> </web-app>
二、静态资源物理位置配置错误
你配置的<mvc:resources mapping="/resources/**" location="/resources/"/>中,location="/resources/"指向的是web应用根目录下的resources文件夹(Maven项目对应src/main/webapp/resources/路径)。
请按以下规则调整文件位置:
- 若使用当前配置,
index.html需放在:src/main/webapp/resources/index.html,访问URL为http://localhost:端口号/resources/index.html - 若想把资源放在
WEB-INF/resources下,修改location为:<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/> - 若资源在classpath下(比如
src/main/resources/static),需给location加上classpath:前缀:<mvc:resources mapping="/resources/**" location="classpath:/static/"/>
三、重复组件扫描的潜在问题
你的root-context.xml和web-context.xml都配置了<context:component-scan base-package="my.application"/>,会导致Controller等Bean重复注册。虽不直接影响静态资源,但可能引发其他异常,建议拆分扫描范围:
- root-context:扫描非Web层Bean(如Service、Repository),例如
base-package="my.application.service,my.application.dao" - web-context:仅扫描Web层Bean(如Controller),例如
base-package="my.application.controller"
四、注解式配置的正确写法(替代XML)
如果用Java配置替代XML,确保配置类符合规范:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "my.application.controller") public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**") .addResourceLocations("/resources/"); // 若资源在classpath下,替换为: // .addResourceLocations("classpath:/static/"); } }
同时需调整DispatcherServlet配置,指向该配置类而非web-context.xml。
五、额外排查步骤
- 检查打包后结构:确认resources目录和
index.html是否被正确打包到war包的对应位置 - 开启调试日志:添加Spring MVC日志配置,查看DispatcherServlet处理请求时的资源查找流程,定位具体错误点
- 排查拦截器/过滤器:确认没有自定义Filter或Interceptor拦截了
/resources/**路径的请求
内容的提问来源于stack exchange,提问作者JCvanDamme
相关产品推荐
相关产品推荐

