我的旅程开始于我尝试将MongoDB的Java驱动程序配置为使用UUID v4而不是默认设置的Legacy UUID v3。
我在这里发现了这个解决方案https://groups.google.com/forum/#!msg/mongodb-user/ZJKQpMpCMU4/dW5ATHTcAvgJ。
但正如他所说:
请注意,使用旧版API时,会忽略编解码器注册表 这不会使用重写的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
,但仍然无效。有没有解决方案?
答案 0 :(得分:4)
MongoClient
扩展了Mongo
,其通过DB
引用了遗留api getDB()
类。虽然您已使用MongoClient
注册了新的UUID编解码器,但只有当您使用getDatabase()
获取MongoDatabase
春天模板当前版本并未使用getDB()
时才能使用该编解码器for each table
write the header
write datas
next table
。因此,您对注册表的更改从未使用过。
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/