Jackson无法反序列化格式合法的LocalDateTime问题求助
解决@JsonFormat反序列化LocalDateTime失败的问题
问题核心
报错提示在字符串索引10处解析失败,对应日期与时间之间的空格,本质是Jackson处理Java 8时间API时,需明确指定格式匹配的时区,且@NotBlank注解不适用于LocalDateTime类型(该注解仅用于字符串校验),同时需确保Jackson支持Java 8时间模块。
修复方案
1. 替换错误的校验注解
@NotBlank是字符串专属校验注解,不能直接用于LocalDateTime字段,改用@NotNull校验对象非空:
@NotNull private LocalDateTime transactionTime;
2. 完善@JsonFormat注解
添加timezone属性指定时区(如GMT+8或Asia/Shanghai),确保解析时的时区一致性,完整注解如下:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @NotNull private LocalDateTime transactionTime;
3. 确保依赖完整性(Jackson版本 < 2.10)
若你的Jackson版本低于2.10,需手动引入Java 8时间支持模块:
Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>你的Jackson版本号</version> </dependency>
Gradle依赖:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:你的Jackson版本号'
4. 全局配置替代字段注解(可选)
若多个字段需统一格式,可在Jackson配置类中全局设置,避免重复加注解:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); JavaTimeModule module = new JavaTimeModule(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 配置全局序列化/反序列化格式 module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); mapper.registerModule(module); // 关闭日期转时间戳的默认行为 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }
关于@JsonDeserialize/@JsonSerialize的补充说明
你使用的默认LocalDateTimeDeserializer/LocalDateTimeSerializer采用ISO-8601格式(如2024-01-31T14:25:00),因此能正常解析但不符合你的格式需求。若要继续用这两个注解,需自定义格式传入:
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @NotNull private LocalDateTime transactionTime;
不过更推荐使用@JsonFormat+时区的方式,更简洁直接。
内容的提问来源于stack exchange,提问作者Prasanth Ravi
相关产品推荐
相关产品推荐

