Spring Boot项目,LocalDateTime参数在不同传参方式下的报错

背景

很基础的问题,只是项目中有遇到,简单记录一下

两个类似的请求,一个为GET请求,普通传参方式,一个为POST请求,JSON传参,用@RequestBody接受,两者的传参是同一个对象,其中有个参数updateTime,类型为LocalDateTime

GET请求正常,POST请求会报400

原因

很基础的问题

GET请求的参数通常通过URL查询参数传递,这意味着所有参数都被视为字符串。当这些参数到达后端时,Spring的转换服务会尝试将这些字符串参数转换为相应的类型。对于LocalDateTime这样的类型,Spring已经注册了合适的转换器,能够将字符串自动转换为LocalDateTime对象,前提是该字符串符合一定的格式规范。

默认情况下,Spring Boot配置了一系列的格式化器和转换器来处理常见的类型转换,包括从字符串到LocalDateTime的转换。这意味着,当你通过查询参数发送一个日期时间格式的字符串时,Spring能够识别这个字符串并将其自动转换为LocalDateTime对象,只要这个字符串的格式是可被解析的。

然而,在处理POST请求中的JSON数据时,转换过程有些不同。POST请求的主体通常包含JSON格式的数据,Spring需要将这个JSON数据反序列化为Java对象。这个过程是由Jackson完成的,而Jackson处理日期时间类型的方式需要明确的配置来指定日期时间的格式,或者使用一些特定的模块如jackson-datatype-jsr310,后者提供了对Java 8日期和时间API的支持。如果没有适当的配置或模块,Jackson在试图将JSON中的日期时间字符串反序列化为LocalDateTime对象时就会遇到问题。

因此,对于GET和POST请求之间的差异主要在于参数的传递和处理方式的不同:GET请求中的查询参数被直接视为字符串,并通过Spring的转换服务处理;而POST请求中的JSON数据则需要通过Jackson进行反序列化,这需要额外的配置或注释来成功处理日期时间类型的数据。

 
posted @ 2024-05-15 19:04  糖醋小灰  阅读(141)  评论(0编辑  收藏  举报