我的旅程始于我尝试将 MongoDB 的 Java 驱动程序配置为使用 UUID v4 而不是默认设置的 Legacy UUID v3。
我在这里找到了这个解决方案 https://groups.google.com/forum/#!msg/mongodb-user/ZJKQpMpCMU4/dW5ATHTcAvgJ哪个有效。
但正如他所说:
Note that when using the legacy API the codec registry is ignored, so this will not use the overridden UUIDCodec
它不适用于我的 MongoRepositoy
。
这是我的实际配置:
@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
ServerAddress server = new ServerAddress(host,port);
MongoClientOptions.Builder mcoBuilder = MongoClientOptions.builder();
CodecRegistry codecRegistry = fromRegistries(fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
MongoClient.getDefaultCodecRegistry());
mcoBuilder.codecRegistry(codecRegistry).build();
MongoClientOptions options = mcoBuilder.build();
MongoClient mongoClient = new MongoClient(server,options);
return new SimpleMongoDbFactory(mongoClient, mongoDataBase);
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
return mongoTemplate;
}
如果我这样做:
mongoClient.getDatabase(mongoDataBase).getCollection("test")
.insertOne(new Document("_id",UUID.randomUUID()));
我明白了:
{ "_id" : BinData(4,"f0u8ig4TS6KaJGK93xmvNw==") }
否则:
mongoTemplate.getCollection("test")
.insert(new BasicDBObject("_id", UUID.randomUUID()));
结果:
{ "_id" : BinData(3,"mUX4PTPBJo6bIjPufHf0vg==") }
我知道 MongoRepository
使用 MongoTemplate
,尽管我已将实例设置为使用 MongoClient
而不是旧的 Mongo
,仍然无法正常工作。有什么解决办法吗?
最佳答案
MongoClient
扩展了 Mongo
,它通过 getDB()
引用了遗留 api DB
类。虽然您已经使用 MongoClient
注册了新的 UUID 编解码器,但只能在您使用 getDatabase()
获取 MongoDatabase
哪个 spring mongo 模板时使用当前版本没有并使用 getDB()
。因此,您对注册表的更改永远不会被使用。
Spring MongoDB 2.0.0 版本已更新为使用新的 java 驱动程序 API。因此,您的更改应该可以在 2.0.0 版本中正常工作。
http://docs.spring.io/spring-data/data-mongo/docs/2.0.0.M4/reference/html/
关于mongodb - 如何配置 MongoRepository 以使用新的 MongoClient API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905341/