【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *
使用 cursor 进行老项目更新为 springboot 的 web 项目,发生了奇怪的问题,就是 html 文件访问正常,但是静态文件就是 404
检查了各种配置,各种比较,各种调试,最后放弃时候,清理没用的配置文件,发现了一个老的配置类
@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {Logger logger = LoggerFactory.getLogger(DateTimeConfig.class);@Beanpublic FormattingConversionService mvcConversionService() {logger.info("mvcConversionService 执行了");DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));dateTimeRegistrar.registerFormatters(conversionService);DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();dateRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));dateRegistrar.registerFormatters(conversionService);return conversionService;}
}
将 WebMvcConfigurationSupport 替换为 WebMvcConfigurerAdapter 解决了问题,原因在于两者在 Spring MVC 中的 行为差异 和 配置优先级。以下是详细分析:
1. 行为差异
| 特性 | WebMvcConfigurationSupport | WebMvcConfigurerAdapter |
|---|---|---|
| 作用 | 完全覆盖 Spring MVC 默认配置 | 扩展 Spring MVC 默认配置 |
| 影响范围 | 全局配置,优先级最高 | 局部配置,优先级较低 |
| 推荐使用场景 | 需要完全自定义 MVC 配置 | 仅需扩展默认配置 |
2. 问题根源
使用 WebMvcConfigurationSupport 的问题
- 覆盖默认配置:继承
WebMvcConfigurationSupport会 完全禁用 Spring Boot 的自动配置(如静态资源处理、视图解析器等)。 - 静态资源失效:默认的静态资源路径(
classpath:/static/)会被覆盖,导致资源无法访问。
使用 WebMvcConfigurerAdapter 的优势
- 扩展默认配置:
WebMvcConfigurerAdapter仅 扩展 Spring MVC 配置,不会覆盖默认行为。 - 保留自动配置:Spring Boot 的自动配置(如静态资源处理)仍然生效。
3. 解决方案
推荐使用 WebMvcConfigurer
WebMvcConfigurerAdapter 已被标记为 @Deprecated,建议直接实现 WebMvcConfigurer 接口:
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/plugins/**").addResourceLocations("classpath:/static/plugins/").setCachePeriod(0);}
}
关键配置对比
| 配置项 | WebMvcConfigurationSupport | WebMvcConfigurer |
|---|---|---|
| 静态资源处理 | 需手动配置所有资源路径 | 仅需扩展默认配置 |
| 视图解析器 | 需手动配置 | 自动配置 + 扩展 |
| 拦截器 | 需手动注册 | 自动配置 + 扩展 |
4. 验证步骤
-
检查静态资源路径
jar -tvf target/*.jar | grep "mdui.min.css" # 正确输出: # BOOT-INF/classes/static/plugins/mdui/css/mdui.min.css -
访问资源URL
curl -v http://localhost:8080/plugins/mdui/css/mdui.min.css # 预期响应: # HTTP/1.1 200 # Content-Type: text/css -
查看资源加载日志
在application.yml中开启调试日志:logging:level:org.springframework.web: DEBUG正常日志:
DEBUG o.s.w.s.r.ResourceHttpRequestHandler - Resource found: class path resource [static/plugins/mdui/css/mdui.min.css]
- 优化后的代码
@Configuration
public class DateTimeConfig implements WebMvcConfigurer {private static final Logger logger = LoggerFactory.getLogger(DateTimeConfig.class);@Overridepublic void addFormatters(FormatterRegistry registry) {logger.info("DateTimeConfig: 注册自定义日期时间格式化器");// 注册 Java 8 日期时间格式化器DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));dateTimeRegistrar.registerFormatters(registry);// 注册传统日期格式化器DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();dateRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));dateRegistrar.registerFormatters(registry);}
}
5. 总结
WebMvcConfigurationSupport:适合需要 完全自定义 MVC 配置的场景,但会 覆盖默认行为。WebMvcConfigurer:适合 扩展默认配置,保留 Spring Boot 的自动配置能力。
通过替换为 WebMvcConfigurer,静态资源处理得以保留,问题自然解决。
相关文章:
【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *
使用 cursor 进行老项目更新为 springboot 的 web 项目,发生了奇怪的问题,就是 html 文件访问正常,但是静态文件就是 404 检查了各种配置,各种比较,各种调试,最后放弃时候,清理没用的配置文件&…...
Spring Boot 3.x 基于 Redis 实现邮箱验证码认证
文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…...
PostgreSQL10 物理流复制实战:构建高可用数据库架构!
背景 PostgreSQL 10 在高可用架构中提供了物理复制,也称为流复制(Streaming Replication),用于实现实例级别的数据同步。PostgreSQL 复制机制主要包括物理复制和逻辑复制:物理复制依赖 WAL 日志进行物理块级别的同步&…...
从零开始开发纯血鸿蒙应用之语音朗读
从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...
RabbitMQ系列(五)基本概念之Queue
在 RabbitMQ 中,Queue(队列) 是存储消息的容器,也是消息传递的核心载体。以下是其核心特性与作用的全方位解析: 一、Queue 的定义与核心作用 消息存储容器 Queue 是 RabbitMQ 中实际存储消息的实体,生产者…...
奔图Pantum M7165DN黑白激光打印一体机报数据清除中…维修
故障描述: 一台奔图Pantum M7165DN黑白激光打印一体机开机自检正常,自检过后就不能工作了,按键面板无任何反应一直提示数据清除中…,如果快速操作的话也能按出菜单、功能啥的,不过一会又死机了,故障请看下图: 故障检修: 经分析可能是主板数据出现了问题,看看能不能快速…...
TP-LINK路由器如何设置网段、网关和DHCP服务
目标 ①将路由器的网段由192.168.1.XXX改为192.168.5.XXX ②确认DHCP是启用的,并将DHCP的IP池的范围设置为排除自己要手动指定的IP地址,避免IP冲突。 01-复位路由器 路由器按住复位键10秒以上进行重置操作 02-进入路由器管理界面 电脑连接到路由器&…...
神经网络代码入门解析
神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…...
设计一个“车速计算”SWC,通过Sender-Receiver端口输出车速信号。
1. 需求分析 功能目标:根据车轮脉冲信号(轮速传感器输入)计算当前车速,并将结果通过Sender端口发送给其他SWC。 输入:轮速脉冲数(如WheelPulse,类型uint32)。 输出:车速(如VehicleSpeed,类型float32,单位km/h)。 触发方式:周期性计算(例如每10ms执行一次)。 2.…...
TCP/IP 5层协议簇:网络层(IP数据包的格式、路由器原理)
目录 1. TCP/IP 5层协议簇 2. IP 三层包头协议 3. 路由器原理 4. 交换机和路由的对比 1. TCP/IP 5层协议簇 如下: 2. IP 三层包头协议 数据包如下:IP包头不是固定的,每一个数字是一个bit 其中数据部分是上层的内容,IP包头最…...
1JVM概念
JVM(Java虚拟机)详解 1. 基本概念与作用 JVM(Java Virtual Machine)是Java程序的运行环境,负责将编译后的字节码(.class文件)解释或编译为机器指令执行,并管理内存、线程、安全…...
echarts柱状图不是完全铺满容器,左右两边有空白
目录 处理前:echarts柱状图不是完全铺满容器,左右两边有空白处理前:通过调整 grid 组件配置处理后效果修改代码:1. 调整 grid 组件配置原理解决办法 2. 处理 xAxis 的 boundaryGap 属性原理解决办法 3. 调整 barMaxWidth 和 barMi…...
ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图
在地理信息系统(GIS)领域,地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台,提供了丰富且详尽的地表覆盖数据。然而,这些数据通常以栅格格式存在,不利于进行空间分析和数据…...
西门子S7-1200比较指令
西门子S7-1200 PLC比较指令学习笔记 一、比较指令的作用 核心功能:用于比较两个数值的大小或相等性,结果为布尔值(True/False)。典型应用: 触发条件控制(如温度超过阈值启动报警)数据筛选&…...
【AD】3-6 层次原理图
自上而下 1.放置-页面符号,并设置属性 2.放置-端口 可通过如下设置将自动生成关掉 3.放置-添加图纸入口,并创建图纸 自下而上 1.子图的原理图页设计 设计资原理图,复制网络标签,智能粘贴未PORT 2.新建主图原理图 创建框…...
精品整理-2025 DeepSeek核心技术解析与实践资料合集(24份)
2025 DeepSeek核心技术解析与实践资料合集,共24份。 2025 DeepSeek 火爆背后的核心技术:知识蒸馏技术.pdf 2025 DeepSeek-R1详细解读:DeepSeek-R1-Zero和DeepSeek-R1分析.pdf 2025 DeepSeek-V3三个关键模块详细解读:MLAMoEMTP.pd…...
【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)
论文:https://arxiv.org/pdf/2312.16084 代码:https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询(Open-voca…...
如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程
如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程 在软件开发过程中,持续集成(CI)和持续交付(CD)已经成为现代开发和运维的标准实践。随着代码的迭代越来越频繁,传统的手动部署方式不仅低效,而且容易出错。为了提高开发效率和代码质量,Jenkins作为一款…...
【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案
【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案 一、前言 目前应用上架华为AGC平台,都会被要求适配折叠屏设备。目前华为系列的折叠屏手机,有华为 Mate系列(左右折叠,华为 Mate XT三折叠),华为Pocket 系列…...
Spark内存迭代计算
一、宽窄依赖 窄依赖:父RDD的一个分区数据全部发往子RDD的一个分区 宽依赖:父RDD的一个分区数据发往子RDD的多个分区,也称为shuffle 二、Spark是如何进行内存计算的?DAG的作用?Stage阶段划分的作用? &a…...
数据库基础二(数据库安装配置)
打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是: 1:安装所有 MySQL 数据库需要的产品; 2:仅使用 MySQL 数据库的服务器; 3&a…...
HumanPro逼真角色皮肤面部动画Blender插件V1.1版
https://www.youtube.com/watch?vnmV_jzgpIPM 本插件是关于HumanPro逼真角色皮肤面部动画Blender插件V1.1版,大小:2.9 MB,支持Blender 4.0 - 4.3版软件,支持Win系统,语言:英语。RRCG分享 HumanPro 是一款…...
基于javaweb的SSM+Maven幼儿园管理系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型
在大规模深度学习模型训练过程中,GPU内存容量往往成为制约因素,尤其是在训练大型语言模型(LLM)和视觉Transformer等现代架构时。由于大多数研究者和开发者无法使用配备海量GPU内存的高端计算集群,因此掌握有效的内存优化技术变得尤为关键。本…...
SQL打折日期交叉问题
1. 数据结构:数据为平台商品促销数据 表名:good_promotion 字段名:brand(品牌)、stt(打折开始日期)、edt(打折结束日期)。 2. 需求: ① 创建表 ② 计算每个…...
【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)
第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…...
硬件工程师入门教程
1.欧姆定律 测电压并联使用万用表测电流串联使用万用表,红入黑出 2.电阻的阻值识别 直插电阻 贴片电阻 3.电阻的功率 4.电阻的限流作用 限流电阻阻值的计算 单位换算关系 5.电阻的分流功能 6.电阻的分压功能 7.电容 电容简单来说是两块不连通的导体加上中间的绝…...
性能测试监控工具jmeter+grafana
1、什么是性能测试监控体系? 为什么要有监控体系? 原因: 1、项目-日益复杂(内部除了代码外,还有中间件,数据库) 2、一个系统,背后可能有多个软/硬件组合支撑,影响性能的因…...
DeepSeek如何快速开发PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear(详见:PDFGear:一款免费的PDF编辑、格式转化软件-CSDN博客),以及在线工具SmallP…...
目标检测——数据处理
1. Mosaic 数据增强 Mosaic 数据增强步骤: (1). 选择四个图像: 从数据集中随机选择四张图像。这四张图像是用来组合成一个新图像的基础。 (2) 确定拼接位置: 设计一个新的画布(输入size的2倍),在指定范围内找出一个随机点(如…...
