MongoDB无法识别org.joda.time.DateTime类型,如何存入数据库?
解决MongoDB存储Joda DateTime的编解码器异常
这个问题我之前也碰到过,本质是MongoDB Java驱动默认不认识Joda的DateTime类型,没法自动完成序列化/反序列化,所以抛出了CodecConfigurationException。给你几个可行的解决办法,按需选择就行:
方案一:转成Java原生Date类型(最简单快捷)
MongoDB驱动默认支持java.util.Date,所以直接把Joda DateTime转成这个类型就行,不需要额外依赖或配置:
DateTime dateTime = new DateTime(); BasicDBObject oldDoc = new BasicDBObject("email", email); // 调用toDate()转成驱动支持的类型 BasicDBObject newDoc = new BasicDBObject("$set", new BasicDBObject("office_move_date", dateTime.toDate())); collection.update(oldDoc, newDoc);
方案二:注册Joda DateTime编解码器(保留Joda类型操作)
如果你的项目大量使用Joda DateTime,不想每次手动转换,可以添加MongoDB官方提供的Joda编解码器依赖,然后注册到Mongo客户端:
1. 添加Maven依赖(版本和你的MongoDB驱动尽量匹配)
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-joda</artifactId> <version>3.12.14</version> </dependency>
2. 创建MongoClient时注册编解码器
// 组合默认编解码器和Joda DateTime编解码器 CodecRegistry codecRegistry = CodecRegistries.fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromCodecs(new DateTimeCodec()) ); // 配置客户端使用自定义注册表 MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(codecRegistry) .build(); MongoClient mongoClient = MongoClients.create(settings);
配置完成后,就可以直接把Joda DateTime对象存入MongoDB,驱动会自动处理序列化逻辑。
方案三:改用Java 8+日期API(长期推荐)
如果你的项目已经升级到Java 8或更高版本,建议改用java.time系列的日期类型(比如Instant、LocalDateTime),MongoDB驱动从3.7版本开始原生支持这些类型,不需要额外依赖,而且更符合Java的现代规范:
Instant now = Instant.now(); BasicDBObject oldDoc = new BasicDBObject("email", email); BasicDBObject newDoc = new BasicDBObject("$set", new BasicDBObject("office_move_date", now)); collection.update(oldDoc, newDoc);
内容的提问来源于stack exchange,提问作者Muiz Uvais
相关产品推荐
相关产品推荐

