SpringBoot集成MongoDB存储LocalDateTime类型错误解码失败如何解决
问题解决步骤
1. 优先修复MongoDB驱动版本冲突
你的依赖中存在核心版本不兼容问题:org.mongodb:mongodb-driver-async:3.12.9属于3.x驱动系列,和你使用的4.x系列同步驱动、Spring Data MongoDB 3.2.x版本完全不兼容,这是导致LocalDateTime被序列化为嵌套文档(DOCUMENT类型)的核心原因。直接删除mongodb-driver-async依赖即可,Spring Data MongoDB 3.x版本已经不再支持3.x系列的异步驱动。
2. 实体类补充Mongo专属注解
你的实体类缺少Spring Data MongoDB的识别注解,且没有显式指定LocalDateTime字段的映射类型,修正后的实体类如下:
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.FieldType; import com.fasterxml.jackson.annotation.JsonInclude; import java.time.LocalDateTime; @JsonInclude(JsonInclude.Include.NON_EMPTY) @Document // 必须添加,让Spring Data MongoDB识别为Mongo文档实体 public class AnnotationSample { // 显式指定映射为BSON日期时间类型,避免序列化时被拆分为嵌套对象 @Field(targetType = FieldType.DATE_TIME) private LocalDateTime startDate; // 必须补充对应getter、setter方法 public LocalDateTime getStartDate() { return startDate; } public void setStartDate(LocalDateTime startDate) { this.startDate = startDate; } }
3. 修正Mongo配置
你现有的自定义转换配置没有和MongoTemplate绑定,导致不生效,使用以下完整配置即可:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.convert.Jsr310Converters; import java.util.ArrayList; @Configuration public class MongoConfig { @Bean public MongoCustomConversions mongoCustomConversions() { return new MongoCustomConversions(new ArrayList<>(Jsr310Converters.getConvertersToRegister())); } @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory databaseFactory, MappingMongoConverter converter) { // 绑定自定义转换器 converter.setCustomConversions(mongoCustomConversions()); // 可选:移除自动写入的_class字段,不影响日期转换逻辑 converter.setTypeMapper(new DefaultMongoTypeMapper(null)); converter.afterPropertiesSet(); return new MongoTemplate(databaseFactory, converter); } }
最后验证
修复配置后,需要先删除之前已经存入MongoDB的、类型为DOCUMENT的错误历史数据,新写入的LocalDateTime字段会自动被序列化为BSON DATE_TIME类型,查询时不会再出现类型不匹配报错。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

