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

Spring Boot中LocalDateTime反序列化InvalidFormatException问题排查

解决Spring Boot中LocalDateTime反序列化异常问题

1. 修复InvalidFormatException的具体方案

方案一:将字段类型改为LocalDate(推荐)

核心问题是前端传递的是纯日期字符串(如"10/01/2024"),但后端用的是包含日期+时间的LocalDateTime类型,@JsonFormat(pattern = "dd/MM/yyyy")只能解析日期部分,无法自动补全时间信息,导致解析失败。

如果业务场景不需要时间部分,直接修改字段类型即可:

// 修改Lancamento类的字段定义
@JsonFormat(pattern = "dd/MM/yyyy")
private LocalDate data;

方案二:保留LocalDateTime类型,自定义解析逻辑

如果必须使用LocalDateTime,需要让Jackson在解析纯日期字符串时自动补全时分秒为00:00:00,有两种实现方式:

方式1:字段级自定义反序列化器

编写自定义反序列化器处理纯日期字符串:

public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
    public CustomLocalDateTimeDeserializer() {
        super(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
    }

    @Override
    public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        String dateStr = parser.getText().trim();
        // 处理纯日期格式,自动补全时分秒
        if (dateStr.length() == 10) {
            return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("dd/MM/yyyy")).atStartOfDay();
        }
        return super.deserialize(parser, context);
    }
}

然后在字段上标注使用该反序列化器:

@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "dd/MM/yyyy")
private LocalDateTime data;

方式2:全局配置Jackson(适用于多字段统一处理场景)

在Spring Boot中添加全局Jackson配置类,统一处理LocalDateTime的解析:

@Configuration
public class JacksonDateTimeConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonDateTimeCustomizer() {
        return builder -> {
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            // 自定义反序列化器,补全纯日期的时间部分
            LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(dateFormatter) {
                @Override
                public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
                    String dateStr = parser.getText().trim();
                    if (dateStr.length() == 10) {
                        return LocalDate.parse(dateStr, dateFormatter).atStartOfDay();
                    }
                    return super.deserialize(parser, context);
                }
            };
            // 全局注册序列化/反序列化器
            builder.deserializerByType(LocalDateTime.class, deserializer);
            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dateFormatter));
        };
    }
}

2. LocalDateTime序列化与反序列化的必要配置

是的,LocalDateTime(属于JSR310日期时间API)的序列化/反序列化需要特定配置:

  • Jackson默认不支持JSR310类型,需依赖jackson-datatype-jsr310组件(Spring Boot的spring-boot-starter-web已默认包含该依赖)。
  • Jackson默认使用ISO-8601格式(如2024-01-10T00:00:00)处理LocalDateTime,如果要使用自定义格式(如dd/MM/yyyy),必须通过以下方式配置:
    • 字段级:使用@JsonFormat指定pattern和timezone(可选),但需注意类型匹配(纯日期字符串对应LocalDate,带时间的字符串对应LocalDateTime)。
    • 全局级:通过Jackson2ObjectMapperBuilderCustomizer统一配置序列化/反序列化规则,避免重复编写注解。

内容的提问来源于stack exchange,提问作者Daniel Lincoln Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:47