You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring MVC静态资源无法访问求助:配置后仍出现404错误

解决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

火山引擎 最新活动