如何解决Spring Boot REST接口RequestBody中Java 8 LocalTime解析HTTP 400错误?
我之前也踩过一模一样的坑!你已经引入了JSR310依赖,但默认的Jackson配置会把LocalTime序列化成那种嵌套的对象结构(就是Swagger显示的{"hour":8,"minute":0,...}),但如果你的请求里传的是更符合直觉的字符串格式(比如"08:00"),Jackson就会因为格式不匹配抛出解析错误,返回400。下面是几种靠谱的解决办法:
1. 给字段加注解指定格式
最简单的方式就是直接在openTime字段上加上Jackson的格式化注解,强制它用字符串格式序列化/反序列化:
import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalTime; public class Location { private String name; @JsonFormat(pattern = "HH:mm:ss") // 可根据需求调整格式,比如"HH:mm" private LocalTime openTime; // getter、setter、构造器省略 }
这样一来,请求体里就可以传{"name":"Test","openTime":"08:00:00"},Jackson就能正确解析了,而且Swagger里也会更新显示对应的字符串格式,不再是嵌套对象。
2. 全局配置Jackson(推荐)
如果项目里有大量日期时间类型需要统一处理,全局配置更省心。比如在Spring Boot项目中,你可以创建一个配置类:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); // 配置LocalTime统一的序列化/反序列化格式 DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); objectMapper.registerModule(javaTimeModule); return objectMapper; } }
这个配置会让所有LocalTime类型都遵循指定的字符串格式处理,不用给每个字段单独加注解。
3. 确认依赖版本匹配(容易忽略的细节)
虽然你说已经引入了JSR310依赖,但要注意版本兼容性。如果是Spring Boot项目,不用单独引入,spring-boot-starter-web已经包含了适配版本的jackson-datatype-jsr310;如果是普通Maven项目,要确保依赖版本和jackson-core、jackson-databind一致:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>你的Jackson版本号</version> </dependency>
版本不匹配很可能导致依赖失效,出现看似无解的解析错误。
最后提醒:配置完成后记得刷新Swagger页面,它会同步更新模型的显示格式,你就能直接用字符串格式传值测试了。
内容的提问来源于stack exchange,提问作者de_xtr

