如何配置MongoRepository以使用新的MongoClient API?

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,仍然无法正常工作.有什么解决方案吗?

use*_*814 4

MongoClientextends Mongo,它通过 引用了旧版 apiDBgetDB()。尽管您已经注册了新的 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/