根本原因是Spring Boot未自动解析yyyy-MM-dd字符串为LocalDate,需用@DateTimeFormat(pattern="yyyy-MM-dd")、String手动解析或全局配置spring.mvc.format.date。

HTML5 提交后后台接收为 null 的常见原因
根本问题不是前端没传,而是后端没正确解析。HTML5 的 固定以 yyyy-MM-dd 格式提交(例如 "2024-06-15"),但 Java Spring Boot 默认的 @RequestParam 或 @RequestBody 绑定无法自动将该字符串转成 LocalDate 或 Date,除非显式配置格式或类型转换器。
- Spring MVC 默认不注册
LocalDate的Converter,直接用String接收又容易忽略空字符串校验 - 前端未设
name属性,或表单用了GET但后端用@RequestBody,导致参数根本没进 controller -
浏览器在日期未选择时会提交空字符串
"",而非null;后端若用LocalDate接收且无默认值,就会因类型转换失败而跳过绑定,最终字段为null
Spring Boot 后端接收 的三种可靠写法
优先推荐明确、可控的方式,避免依赖全局配置带来的隐式行为:
- 用
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date:适用于@RequestParam或@ModelAttribute场景,必须加注解,否则不生效 - 用
String dateStr接收再手动解析:最稳妥,可统一处理空值、非法格式,例如:if (StringUtils.hasText(dateStr)) {
date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
} - 在
application.properties中全局启用spring.mvc.format.date=yyyy-MM-dd:仅对java.time.LocalDate有效,但不解决空字符串问题,仍需配合@NotNull或逻辑判空
前端 必须配合的属性与校验
光靠后端补救不够,前端要减少无效提交:
- 必须设置
name属性,否则表单提交时该字段不会出现在请求参数中 - 建议加
required属性,防止用户跳过选择(此时浏览器会阻止提交并提示) - 不要依赖
value的初始值做“非空”判断——未选时 DOM 中value是空字符串,不是null,JS 检查要用input.value.trim() !== "" - 如果用 AJAX 提交,确保把
input.value当字符串拼入 FormData 或 JSON,别误转成 Date 对象再 toString(),否则格式可能变成"Fri Jun 15 2024...",后端无法识别
容易被忽略的关键点:空值 vs 非法格式 vs 时区
三者表现相似(都可能导致 null),但根源不同:
立即学习“前端免费学习笔记(深入)”;
- 空值:用户没选,提交的是
date=(空字符串),Spring 绑定时若字段是LocalDate且无默认值,直接跳过赋值 → 字段保持null - 非法格式:比如用户用 JS 强行改了 input 的 value 为
"2024/06/15",后端解析失败抛DateTimeParseException,整个请求可能 400,或字段静默为null(取决于配置) - 时区无关:HTML5
date不含时间与时区,纯日期,无需考虑 UTC 转换,别画蛇添足调new Date().toISOString()
真正要盯住的,是空字符串的显式处理和格式注解的强制声明。其他方案看着省事,上线后反而更难定位为什么某次提交日期就丢了。










