ana*_*ius 5 mongodb spring-data spring-boot
我的旅程开始于我尝试配置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;
}
Run Code Online (Sandbox Code Playgroud)
如果我做:
mongoClient.getDatabase(mongoDataBase).getCollection("test")
.insertOne(new Document("_id",UUID.randomUUID()));
Run Code Online (Sandbox Code Playgroud)
我明白了:
{ "_id" : BinData(4,"f0u8ig4TS6KaJGK93xmvNw==") }
Run Code Online (Sandbox Code Playgroud)
除此以外:
mongoTemplate.getCollection("test")
.insert(new BasicDBObject("_id", UUID.randomUUID()));
Run Code Online (Sandbox Code Playgroud)
结果:
{ "_id" : BinData(3,"mUX4PTPBJo6bIjPufHf0vg==") }
Run Code Online (Sandbox Code Playgroud)
我知道MongoRepository使用MongoTemplate,虽然我已经设置了使用的实例,MongoClient而不是旧的Mongo,仍然无法正常工作.有什么解决方案吗?
MongoClientextends Mongo,它通过 引用了旧版 apiDB类getDB()。尽管您已经注册了新的 UUID 编解码器,但MongoClient只有当您使用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/
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |