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
相关产品推荐
相关产品推荐

