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

Spring+MongoDB使用LocalDateTime仍遇Date.parse()错误求解决方案

解决Spring Data MongoDB中String转LocalDateTime的ConversionFailedException问题

1. 先确认MongoDB字段存储类型

检查processing-status集合里listingStatus.createdOn的实际类型:

  • 如果是字符串格式(比如"2024-05-20T12:30:00"或带时区的字符串),需要自定义转换器处理;
  • 如果是ISODate类型,大概率是实体类映射或时区配置问题。

2. 自定义字符串与LocalDateTime的转换器

创建全局转换器,让Spring Data MongoDB能处理两种类型的互转:

import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

// 读取MongoDB字符串转LocalDateTime
@ReadingConverter
public class StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
    // 匹配MongoDB中存储的字符串格式,可根据实际情况修改
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    @Override
    public LocalDateTime convert(String source) {
        return LocalDateTime.parse(source, FORMATTER);
    }
}

// 写入LocalDateTime转MongoDB字符串
@WritingConverter
public class LocalDateTimeToStringConverter implements Converter<LocalDateTime, String> {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    @Override
    public String convert(LocalDateTime source) {
        return source.format(FORMATTER);
    }
}

然后把转换器注册到Mongo配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class MongoConfig {
    @Bean
    public MongoCustomConversions mongoCustomConversions() {
        List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(new StringToLocalDateTimeConverter());
        converters.add(new LocalDateTimeToStringConverter());
        return new MongoCustomConversions(converters);
    }
}

3. 修正实体类嵌套字段映射

确保实体类的嵌套结构和MongoDB字段完全对应:

import org.springframework.data.mongodb.core.mapping.Document;
import java.time.LocalDateTime;

@Document(collection = "processing-status")
public class ProcessingStatus {
    // 其他字段...
    private ListingStatus listingStatus;

    public static class ListingStatus {
        private LocalDateTime createdOn;
        // 生成getter、setter方法
    }
    // 生成getter、setter方法
}

4. 时区适配(若需要)

如果MongoDB存储的是带时区的字符串,修改转换器的格式化器为带时区的规则:

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
// 或者自定义带时区的格式:DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")

同时在Spring配置文件中指定MongoDB时区:

spring.data.mongodb.timezone=UTC

5. 根据报错日志调整格式

如果日志里显示了具体的转换失败字符串(比如"2024-05-20 12:30:00"),直接修改转换器的DateTimeFormatter为对应的格式,比如:

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

内容的提问来源于stack exchange,提问作者Arti M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:58:08