Spring向MySQL插入Date与Timestamp报错的解决方法咨询
你遇到的核心问题是输入的日期时间格式和Spring/MySQL期望的格式不匹配,导致类型转换失败。我们一步步拆解解决:
1. 修复dateOfDeparture的Date类型转换错误
从错误日志能直接定位问题:
Failed to convert from type [java.lang.String] to type [@javax.persistence.Column @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '22-02-2020'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [22-02-2020]
你的实体类给dateOfDeparture配置的@DateTimeFormat(pattern = "yyyy-MM-dd")是年-月-日格式,但输入的22-02-2020是日-月-年格式,Spring无法正确解析。
解决方案:
把注解的格式改成和输入匹配的样式:
@Column(name="departuredate") @DateTimeFormat(pattern = "dd-MM-yyyy") // 改为日-月-年格式,匹配输入的22-02-2020 private Date dateOfDeparture;
2. 修复estimatedTravelTime的Timestamp类型转换错误
错误日志明确给出了Timestamp的格式要求:
Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
java.sql.Timestamp需要完整的日期+时间格式,但你只输入了12:00(仅时间部分),所以转换失败。这里有两种适配方案,根据业务需求选择:
方案A:保留MySQL的timestamp字段类型
如果业务要求departuretime必须存储完整的日期时间,需要两步处理:
- 给实体类字段添加时间格式注解,让Spring能解析单独的时间字符串:
@Column(name="departuretime") @DateTimeFormat(pattern = "HH:mm") // 指定输入的时间格式为小时:分钟 private Timestamp estimatedTravelTime;
- 在保存Flight前,把
dateOfDeparture的日期和输入的时间拼接成完整的Timestamp。比如在你的FlightServices中处理:
public Flight saveFlight(Flight flight) { // 提取出发日期的日历信息 Calendar dateCal = Calendar.getInstance(); dateCal.setTime(flight.getDateOfDeparture()); // 提取输入时间的日历信息 Calendar timeCal = Calendar.getInstance(); timeCal.setTime(flight.getEstimatedTravelTime()); // 将时间部分合并到日期日历中 dateCal.set(Calendar.HOUR_OF_DAY, timeCal.get(Calendar.HOUR_OF_DAY)); dateCal.set(Calendar.MINUTE, timeCal.get(Calendar.MINUTE)); dateCal.set(Calendar.SECOND, 0); // 秒数设为0 // 转换为Timestamp并赋值 flight.setEstimatedTravelTime(new Timestamp(dateCal.getTimeInMillis())); return flightRepository.save(flight); }
方案B:修改MySQL字段类型为time(更适合仅存时间的场景)
如果业务只需要存储时间(不需要关联日期),这是更合理的做法:
- 修改MySQL表的字段类型:
ALTER TABLE FLIGHT MODIFY COLUMN departuretime TIME NOT NULL;
- 实体类对应字段改用Java 8的
LocalTime(推荐)或java.sql.Time:
@Column(name="departuretime") @DateTimeFormat(pattern = "HH:mm") private LocalTime estimatedTravelTime; // 直接存储时间部分,无需日期
这样Spring就能直接把输入的12:00解析为对应的时间类型,无需额外拼接。
验证修改
完成上述调整后,重启应用,输入22-02-2020作为出发日期、12:00作为出发时间,就能成功插入MySQL数据库了。
内容的提问来源于stack exchange,提问作者Abdul Rahman

