You need to enable JavaScript to run this app. SpringBoot+Spring Data MySQL中仅存时分秒的@JsonFormat反序列化报错解决
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Spring Data MySQL中仅存时分秒的@JsonFormat反序列化报错解决

问题核心根因

  • 你在实体类里把entrada字段定义成了java.time.LocalDateTime类型,这个类型天生要求必须同时有年月日+时分秒两部分内容才能正常创建实例,现在前端传的"19:47:11"只有时分秒,没有任何日期信息,Jackson当然没法从这么短的字符串里拼出一个完整的LocalDateTime对象,才会抛出“无法从TemporalAccessor获取LocalDateTime”的解析报错。
  • 你加的@JsonFormat(pattern = "HH:mm:ss")只是告诉Jackson要按“时:分:秒”的格式匹配字符串,根本没解决「字段类型和传参维度不匹配」的根本问题,所以注解加了也无法生效。

完整解决步骤

1. 替换为匹配维度的Java字段类型

把原来的LocalDateTime直接替换成java.time.LocalTime——这是Java8时间包里专门用来存储不带日期、仅时分秒维度的纯时间值的类型,和你要存的数据维度完全匹配,也能和MySQL的对应字段类型无缝适配。
正确的实体字段示例:

@Entity
public class Acao {
    // 其他业务字段...

    // 明确指定数据库列类型为TIME,仅存储时分秒,不带冗余日期信息
    @Column(columnDefinition = "TIME")
    private LocalTime entrada;

    // 省略getter、setter方法
}

2. 配置Jackson格式适配规则

给LocalTime类型的字段加上和预期一致的格式注解,保证前后端交互时的字符串格式统一:

@JsonFormat(pattern = "HH:mm:ss")
private LocalTime entrada;

如果项目里已经全局引入了jackson-datatype-jsr310来适配Java8的时间类型,甚至可以省掉这个单独的注解,默认就能完成LocalTime和HH:mm:ss格式字符串的双向转换,不会再抛出解析异常。

3. 校验数据库表结构匹配性

确认MySQL表里entrada对应的列是TIME类型,不是DATETIME或者TIMESTAMP:TIME类型本身就是设计来存储时分秒值的,存储范围为-838:59:59到838:59:59,不会自动附带冗余的年月日数据,完全符合你“仅存储时分秒格式时间”的需求。

踩坑提醒:如果因为历史代码包袱必须保留LocalDateTime字段类型,也可以自定义Jackson反序列化器,给纯时分秒字符串硬补一个固定的占位日期(比如1970-01-01)来绕开报错,但这种方法会在数据库中存储无意义的冗余日期数据,根本达不到“仅存时分秒”的目标,完全不推荐使用。


内容的提问来源于stack exchange,提问作者Supersan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 05:24:04