【BUG】SpringBoot 静态资源(static)无法访问问题404
1. 将静态资源放在static 或 templates目录中
2. 继承WebMvcConfigurerAdapter 【已经过时】
3. 继承WebMvcConfiguratiWebonSupport 【推荐】
WebMvcConfiguratiWebonSupport 与 WebMvcConfigurer 区别
1. WebMvcProperties 和 ResourceProperties 失效
2. 类路径上的 HttpMessageConverter 失效
SpringBoot访问静态资源出现 404
项目场景
我们使用Springboot框架编写程序,里面使用到了静态资源,如下图所示的 backend目录 和 front目录,如果不进行配置,那么里面的静态文件将无法访问,会报 404的错误
问题描述
我们访问的时候,会出现如下问题
原因分析
在SpringBoot中集成了Tomcat,我们是不需要配置tomcat的,但是其设置了默认值,在不做任何配置的情况下,只能访问名为 static目录 或 templates目录 下的静态资源!
所以我们可以简单粗暴的新建一个目录static,再将上述的两个目录移动至static下即可!
如下所示:
但是这样终究是治标不治本!
解决方案
1. 将静态资源放在static 或 templates目录中
见上方,但是不推荐!
2. 继承WebMvcConfigurerAdapter 【已经过时】
产生诸多情况无法访问,配置麻烦,spring2.0以后不再建议使用
3. 继承WebMvcConfiguratiWebonSupport 【推荐】
在config包下新建一个类WebMVCConfig,让其继承WebMvcConfiguratiWebonSupport
@Configuration
public class WebMVCConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/front/**")
.addResourceLocations("classpath:/front/");
registry.addResourceHandler("/backend/**")
.addResourceLocations("classpath:/backend/");
}
}
4. 实现WebMvcConfigurer接口 【推荐】
与第三个方法类似,但是都是推荐的!!!
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/backend/**")
.addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**")
.addResourceLocations("classpath:/front/");
}
}
WebMvcConfiguratiWebonSupport 与 WebMvcConfigurer 区别
在Spring Boot 2.0后用自己的的配置类继承WebMvcConfigurerAdapter时,idea会提示这个类已经过时了。
所以我们在解决这个问题的时候,一般是使用:
- 实现WebMvcConfigurer
- 继承WebMvcConfigurationSupport
但是继承WebMvcConfigurationSupport时发现会造成一些问题
我们可以先看看 WebMvcAutoConfiguration 类
注意一下这个注解 @ConditionalOnMissingBean
SpringBoot做了这个限制,只有当WebMvcConfigurationSupport类不存在的时候才会生效WebMvc自动化配置,WebMvc自动配置类中不仅定义了classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/等路径的映射,还定义了配置文件spring.mvc开头的配置信息等。
1. WebMvcProperties 和 ResourceProperties 失效
因为两个配置类中的属性都在 WebMvcAutoConfiguration 中使用。当WebMvc自动配置失效(WebMvcAutoConfiguration自动化配置)时,会导致无法视图解析器无法解析并返回到对应的视图。
2. 类路径上的 HttpMessageConverter 失效
如:StringHttpMessageConverterConfiguration、MappingJackson2HttpMessageConverter ,因为 HttpMessageConverters 中持有着所有HttpMessageConverter的实例, 在WebMvcAutoConfigurationAdapter 中会注入 HttpMessageConverters ,因此当WebMvcAutoConfigurationAdapter 不加载时,则会失效,间接的造成spring.http.encoding.charset 与 spring.jackson.date-format 假象的失效。
这一块我看的不是很明白,可以参考一下这里:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~