Spring项目中LocalDateTime类型转换错误的解决方法咨询
嘿,我来帮你搞定这个前端传的2020-06-20T17:35无法转成java.time.LocalDateTime的问题!这个坑我当初学Spring的时候也踩过,其实就是Spring默认的日期转换器不识别这种带T的短时间格式,咱们只需要给实体类的字段加个注解就能解决。
问题根源
你的前端用了type="datetime-local"的输入框,它提交的格式是yyyy-MM-dd'T'HH:mm(比如2020-06-20T17:35),但Spring默认的LocalDateTime转换器没法自动识别这种不带秒的格式,所以抛出了转换失败的异常。
解决方案:给实体类字段添加@DateTimeFormat注解
只需要在Flight实体类的estimatedDepartureTime字段上加上@DateTimeFormat注解,明确指定匹配的格式就行,有两种方式可选:
方式1:使用ISO标准格式推荐
直接用ISO的DATE_TIME类型,它能兼容这种带T的格式:
@Column(name="estimatedDepartureTime",columnDefinition="TIMESTAMP") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) // 新增这个注解 private LocalDateTime estimatedDepartureTime;
方式2:指定精确的格式字符串
如果你想更精准控制格式,可以直接写匹配的pattern:
@Column(name="estimatedDepartureTime",columnDefinition="TIMESTAMP") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") // 完全匹配前端传的格式 private LocalDateTime estimatedDepartureTime;
记得要导入org.springframework.format.annotation.DateTimeFormat包哦(你已经导入了,所以直接加就行)。
为什么这能解决问题?
@DateTimeFormat注解会告诉Spring MVC的参数绑定器,按照你指定的格式去解析前端传来的字符串,把它转换成对应的LocalDateTime对象,这样就不会出现类型不匹配的错误了。
额外提示:全局配置可选
如果你不想每个LocalDateTime字段都加注解,也可以在Spring MVC的配置类里全局设置日期格式:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"); registry.addFormatterForFieldType(LocalDateTime.class, new DateTimeFormatterFormatter(localDateTimeFormatter)); } }
不过对于新手来说,先给单个字段加注解是最直接有效的方式。
现在修改完代码,重启项目再提交表单试试,应该就能正常转换了!
内容的提问来源于stack exchange,提问作者kadrtw

