当前位置: 首页 > news >正文

SpringBoot 静态资源(static)无法访问问题404

SpringBoot访问静态资源出现 404

项目场景

问题描述

​编辑原因分析

解决方案

1. 将静态资源放在static 或 templates目录中

2. 继承WebMvcConfigurerAdapter  【已经过时】

3. 继承WebMvcConfiguratiWebonSupport 【推荐】

4. 实现WebMvcConfigurer接口 【推荐】

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 假象的失效。

这一块我看的不是很明白,可以参考一下这里:

WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南 - 少说点话 - 博客园 (cnblogs.com)https://www.cnblogs.com/sueyyyy/p/11611676.html

相关文章:

  • 混合策略改进的麻雀搜索算法-附代码
  • SNARK性能及安全——Prover篇
  • Docker的安装与操作
  • Zabbix监控入门到跑路
  • 无人机中的坐标系与相机姿态计算
  • 100天精通Python(数据分析篇)——第56天:Pandas读写txt和csv文件(read_csv、to_csv)
  • 【开发小记】vue项目优化
  • 1、javaweb学习知识简析
  • 【Linux操作系统】基础概念和常用指令(一)
  • 类和对象·默认成员函数
  • Elastic Stack(elk+filebeat)
  • PyTorchの可视化工具
  • LeetCode279:完全平方数,动态规划解法超过46%,作弊解法却超过97%
  • docker安装以及运行nacos、rabbitmq、MySQL容器小记
  • S7-200SMART PLC进行MODBUS通信轮询时掉站处理和错误信息提取的具体方法演示
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 收藏网友的 源程序下载网
  • 2017年终总结、随想
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular6错误 Service: No provider for Renderer2
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CSS 专业技巧
  • Java读取Properties文件的六种方法
  • java多线程
  • Java基本数据类型之Number
  • Python十分钟制作属于你自己的个性logo
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 码农张的Bug人生 - 初来乍到
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前嗅ForeSpider教程:创建模板
  • 前言-如何学习区块链
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 白色的风信子
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云ACE认证学习知识点梳理
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Charles)如何抓取手机http的报文
  • (c语言+数据结构链表)项目:贪吃蛇
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (笔试题)分解质因式
  • (分布式缓存)Redis持久化
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十二)Flink Table API
  • (十一)c52学习之旅-动态数码管
  • (四)linux文件内容查看
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (译) 函数式 JS #1:简介
  • (转)jdk与jre的区别
  • (转)Sql Server 保留几位小数的两种做法