You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:59:55