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
相关产品推荐
相关产品推荐

