Spring MVC静态资源无法访问求助:配置后仍出现404错误
嘿,我之前也踩过Spring MVC静态资源映射的坑,给你几个排查方向,应该能搞定这个404问题:
1. 资源路径前缀与斜杠问题
你当前的addResourceLocations配置是"/resources/",但如果你的resources文件夹是放在src/main/resources下的(Maven/Gradle项目的标准资源目录),需要加上classpath:前缀告诉Spring去类路径下查找,同时确保路径结尾的斜杠正确。修改后的代码应该是这样:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/img/**") .addResourceLocations("classpath:/resources/"); }
2. 确认资源文件的实际位置
你的映射规则是/img/**对应/resources/,那你的图片文件必须放在src/main/resources/resources/目录下(比如src/main/resources/resources/P123.jpeg),这样访问http://localhost:8080/img/P123.jpeg才能命中。
如果你的图片是直接放在src/main/resources/根目录下,那需要把addResourceLocations改成"classpath:/";如果是放在src/main/resources/img/下,就改成"classpath:/img/"。
3. 检查DispatcherServlet的映射配置
如果你的DispatcherServlet被映射成了/*,它会拦截所有请求,包括静态资源请求,这时候即使配置了资源处理器也会失效。你需要把它的映射改成/,这样Spring会把静态资源请求交给默认Servlet处理,或者你的自定义资源处理器。
比如在web.xml里:
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
如果是Java配置的初始化器:
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // ...其他配置 @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
4. 确保启用WebMvc配置
别忘了在你的WebApplicationContextConfig类上加上@EnableWebMvc注解,这个注解会启用Spring MVC的核心配置,包括静态资源处理的相关逻辑:
@Configuration @EnableWebMvc public class WebApplicationContextConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/img/**") .addResourceLocations("classpath:/resources/"); } }
另外提一句,Spring 5及以后版本WebMvcConfigurerAdapter已经被废弃了,直接实现WebMvcConfigurer接口就好,功能是一样的。
5. 清理项目缓存并重新构建
有时候IDE的缓存或者编译后的资源没有同步,导致图片没有被正确打包到classpath里。试试执行mvn clean install(Maven项目)或者gradle clean build(Gradle项目),然后重启服务器再试试。
先从这几个点排查,应该能解决你的问题~
内容的提问来源于stack exchange,提问作者cerbin




