Skip to content

Commit d2d6dbd

Browse files
christophstroblsnicoll
authored andcommitted
Upgrade to MongoDB Java Driver 4.0 beta1
See gh-19960
1 parent cf473ee commit d2d6dbd

26 files changed

+320
-366
lines changed

Diff for: spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ dependencies {
8383
optional("org.influxdb:influxdb-java")
8484
optional("org.jolokia:jolokia-core")
8585
optional("org.liquibase:liquibase-core")
86-
optional("org.mongodb:mongodb-driver-async")
86+
optional("org.mongodb:mongodb-driver-sync")
8787
optional("org.mongodb:mongodb-driver-reactivestreams")
8888
optional("org.springframework:spring-jdbc")
8989
optional("org.springframework:spring-jms")

Diff for: spring-boot-project/spring-boot-actuator/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ dependencies {
4343
optional("org.hibernate.validator:hibernate-validator")
4444
optional("org.influxdb:influxdb-java")
4545
optional("org.liquibase:liquibase-core")
46-
optional("org.mongodb:mongodb-driver-async")
46+
optional("org.mongodb:mongodb-driver-sync")
4747
optional("org.mongodb:mongodb-driver-reactivestreams")
4848
optional("org.springframework:spring-jdbc")
4949
optional("org.springframework:spring-messaging")

Diff for: spring-boot-project/spring-boot-autoconfigure/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ dependencies {
9595
optional("org.jooq:jooq")
9696
optional("org.liquibase:liquibase-core")
9797
optional("org.messaginghub:pooled-jms")
98-
optional("org.mongodb:mongodb-driver-async")
98+
optional("org.mongodb:mongodb-driver-sync")
9999
optional("org.mongodb:mongodb-driver-reactivestreams")
100100
optional("org.quartz-scheduler:quartz")
101101
optional("org.springframework:spring-jdbc")

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoClientDependsOnBeanFactoryPostProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.data.mongo;
1818

19-
import com.mongodb.MongoClient;
19+
import com.mongodb.client.MongoClient;
2020

2121
import org.springframework.beans.factory.config.BeanDefinition;
2222
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.data.mongo;
1818

19-
import com.mongodb.MongoClient;
20-
2119
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2220
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2321
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -48,7 +46,7 @@
4846
* @since 1.1.0
4947
*/
5048
@Configuration(proxyBeanMethods = false)
51-
@ConditionalOnClass({ MongoClient.class, com.mongodb.client.MongoClient.class, MongoTemplate.class })
49+
@ConditionalOnClass({ com.mongodb.client.MongoClient.class, MongoTemplate.class })
5250
@EnableConfigurationProperties(MongoProperties.class)
5351
@Import({ MongoDataConfiguration.class, MongoDbFactoryConfiguration.class, MongoDbFactoryDependentConfiguration.class })
5452
@AutoConfigureAfter(MongoAutoConfiguration.class)

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDbFactoryConfiguration.java

+9-14
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.data.mongo;
1818

19-
import com.mongodb.MongoClient;
19+
import com.mongodb.client.MongoClient;
2020

2121
import org.springframework.beans.factory.ObjectProvider;
2222
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
@@ -27,31 +27,26 @@
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Conditional;
2929
import org.springframework.context.annotation.Configuration;
30-
import org.springframework.data.mongodb.MongoDbFactory;
31-
import org.springframework.data.mongodb.core.MongoDbFactorySupport;
32-
import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;
33-
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
30+
import org.springframework.data.mongodb.MongoDatabaseFactory;
31+
import org.springframework.data.mongodb.core.MongoDatabaseFactorySupport;
32+
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
3433

3534
/**
36-
* Configuration for a {@link MongoDbFactory}.
35+
* Configuration for a {@link MongoDatabaseFactory}.
3736
*
3837
* @author Andy Wilkinson
3938
*/
4039
@Configuration(proxyBeanMethods = false)
41-
@ConditionalOnMissingBean(MongoDbFactory.class)
40+
@ConditionalOnMissingBean(MongoDatabaseFactory.class)
4241
@Conditional(AnyMongoClientAvailable.class)
4342
class MongoDbFactoryConfiguration {
4443

4544
@Bean
46-
MongoDbFactorySupport<?> mongoDbFactory(ObjectProvider<MongoClient> mongo,
47-
ObjectProvider<com.mongodb.client.MongoClient> mongoClient, MongoProperties properties) {
48-
MongoClient preferredClient = mongo.getIfAvailable();
49-
if (preferredClient != null) {
50-
return new SimpleMongoDbFactory(preferredClient, properties.getMongoClientDatabase());
51-
}
45+
MongoDatabaseFactorySupport<?> mongoDbFactory(ObjectProvider<MongoClient> mongoClient, MongoProperties properties) {
46+
5247
com.mongodb.client.MongoClient fallbackClient = mongoClient.getIfAvailable();
5348
if (fallbackClient != null) {
54-
return new SimpleMongoClientDbFactory(fallbackClient, properties.getMongoClientDatabase());
49+
return new SimpleMongoClientDatabaseFactory(fallbackClient, properties.getMongoClientDatabase());
5550
}
5651
throw new IllegalStateException("Expected to find at least one MongoDB client.");
5752
}

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDbFactoryDependentConfiguration.java

+16-23
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.autoconfigure.data.mongo;
1818

1919
import com.mongodb.ClientSessionOptions;
20-
import com.mongodb.DB;
2120
import com.mongodb.client.ClientSession;
2221
import com.mongodb.client.MongoDatabase;
2322

@@ -28,7 +27,7 @@
2827
import org.springframework.context.annotation.Configuration;
2928
import org.springframework.dao.DataAccessException;
3029
import org.springframework.dao.support.PersistenceExceptionTranslator;
31-
import org.springframework.data.mongodb.MongoDbFactory;
30+
import org.springframework.data.mongodb.MongoDatabaseFactory;
3231
import org.springframework.data.mongodb.core.MongoOperations;
3332
import org.springframework.data.mongodb.core.MongoTemplate;
3433
import org.springframework.data.mongodb.core.convert.DbRefResolver;
@@ -43,12 +42,12 @@
4342
import org.springframework.util.StringUtils;
4443

4544
/**
46-
* Configuration for Mongo-related beans that depend on a {@link MongoDbFactory}.
45+
* Configuration for Mongo-related beans that depend on a {@link MongoDatabaseFactory}.
4746
*
4847
* @author Andy Wilkinson
4948
*/
5049
@Configuration(proxyBeanMethods = false)
51-
@ConditionalOnBean(MongoDbFactory.class)
50+
@ConditionalOnBean(MongoDatabaseFactory.class)
5251
class MongoDbFactoryDependentConfiguration {
5352

5453
private final MongoProperties properties;
@@ -59,13 +58,13 @@ class MongoDbFactoryDependentConfiguration {
5958

6059
@Bean
6160
@ConditionalOnMissingBean(MongoOperations.class)
62-
MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {
61+
MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter converter) {
6362
return new MongoTemplate(mongoDbFactory, converter);
6463
}
6564

6665
@Bean
6766
@ConditionalOnMissingBean(MongoConverter.class)
68-
MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,
67+
MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context,
6968
MongoCustomConversions conversions) {
7069
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
7170
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
@@ -75,60 +74,54 @@ MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMapping
7574

7675
@Bean
7776
@ConditionalOnMissingBean(GridFsOperations.class)
78-
GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory, MongoTemplate mongoTemplate) {
77+
GridFsTemplate gridFsTemplate(MongoDatabaseFactory mongoDbFactory, MongoTemplate mongoTemplate) {
7978
return new GridFsTemplate(new GridFsMongoDbFactory(mongoDbFactory, this.properties),
8079
mongoTemplate.getConverter());
8180
}
8281

8382
/**
84-
* {@link MongoDbFactory} decorator to respect
83+
* {@link MongoDatabaseFactory} decorator to respect
8584
* {@link MongoProperties#getGridFsDatabase()} if set.
8685
*/
87-
static class GridFsMongoDbFactory implements MongoDbFactory {
86+
static class GridFsMongoDbFactory implements MongoDatabaseFactory {
8887

89-
private final MongoDbFactory mongoDbFactory;
88+
private final MongoDatabaseFactory mongoDbFactory;
9089

9190
private final MongoProperties properties;
9291

93-
GridFsMongoDbFactory(MongoDbFactory mongoDbFactory, MongoProperties properties) {
92+
GridFsMongoDbFactory(MongoDatabaseFactory mongoDbFactory, MongoProperties properties) {
9493
Assert.notNull(mongoDbFactory, "MongoDbFactory must not be null");
9594
Assert.notNull(properties, "Properties must not be null");
9695
this.mongoDbFactory = mongoDbFactory;
9796
this.properties = properties;
9897
}
9998

10099
@Override
101-
public MongoDatabase getDb() throws DataAccessException {
100+
public MongoDatabase getMongoDatabase() throws DataAccessException {
102101
String gridFsDatabase = this.properties.getGridFsDatabase();
103102
if (StringUtils.hasText(gridFsDatabase)) {
104-
return this.mongoDbFactory.getDb(gridFsDatabase);
103+
return this.mongoDbFactory.getMongoDatabase(gridFsDatabase);
105104
}
106-
return this.mongoDbFactory.getDb();
105+
return this.mongoDbFactory.getMongoDatabase();
107106
}
108107

109108
@Override
110-
public MongoDatabase getDb(String dbName) throws DataAccessException {
111-
return this.mongoDbFactory.getDb(dbName);
109+
public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException {
110+
return this.mongoDbFactory.getMongoDatabase(dbName);
112111
}
113112

114113
@Override
115114
public PersistenceExceptionTranslator getExceptionTranslator() {
116115
return this.mongoDbFactory.getExceptionTranslator();
117116
}
118117

119-
@Override
120-
@Deprecated
121-
public DB getLegacyDb() {
122-
return this.mongoDbFactory.getLegacyDb();
123-
}
124-
125118
@Override
126119
public ClientSession getSession(ClientSessionOptions options) {
127120
return this.mongoDbFactory.getSession(options);
128121
}
129122

130123
@Override
131-
public MongoDbFactory withSession(ClientSession session) {
124+
public MongoDatabaseFactory withSession(ClientSession session) {
132125
return this.mongoDbFactory.withSession(session);
133126
}
134127

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoRepositoriesAutoConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.data.mongo;
1818

19-
import com.mongodb.MongoClient;
19+
import com.mongodb.client.MongoClient;
2020

2121
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2222
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package org.springframework.boot.autoconfigure.mongo;
1818

19-
import com.mongodb.MongoClient;
20-
import com.mongodb.MongoClientOptions;
19+
import java.util.stream.Collectors;
20+
21+
import com.mongodb.MongoClientSettings;
22+
import com.mongodb.client.MongoClient;
2123

2224
import org.springframework.beans.factory.ObjectProvider;
2325
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -45,10 +47,13 @@
4547
public class MongoAutoConfiguration {
4648

4749
@Bean
48-
@ConditionalOnMissingBean(type = { "com.mongodb.MongoClient", "com.mongodb.client.MongoClient" })
49-
public MongoClient mongo(MongoProperties properties, ObjectProvider<MongoClientOptions> options,
50-
Environment environment) {
51-
return new MongoClientFactory(properties, environment).createMongoClient(options.getIfAvailable());
50+
@ConditionalOnMissingBean(type = { "com.mongodb.client.MongoClient" })
51+
public MongoClient mongo(MongoProperties properties, Environment environment,
52+
ObjectProvider<MongoClientSettingsBuilderCustomizer> builderCustomizers,
53+
ObjectProvider<MongoClientSettings> settings) {
54+
return new MongoClientFactory(properties, environment,
55+
builderCustomizers.orderedStream().collect(Collectors.toList()))
56+
.createMongoClient(settings.getIfAvailable());
5257
}
5358

5459
}

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoClientFactory.java

+13-96
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,11 @@
1616

1717
package org.springframework.boot.autoconfigure.mongo;
1818

19-
import java.util.Collections;
2019
import java.util.List;
2120

22-
import com.mongodb.MongoClient;
23-
import com.mongodb.MongoClientOptions;
24-
import com.mongodb.MongoClientOptions.Builder;
25-
import com.mongodb.MongoClientURI;
26-
import com.mongodb.MongoCredential;
27-
import com.mongodb.ServerAddress;
21+
import com.mongodb.MongoClientSettings;
22+
import com.mongodb.client.MongoClient;
23+
import com.mongodb.client.MongoClients;
2824

2925
import org.springframework.core.env.Environment;
3026

@@ -39,102 +35,23 @@
3935
* @author Stephane Nicoll
4036
* @author Nasko Vasilev
4137
* @author Mark Paluch
38+
* @author Christoph Strobl
4239
* @since 2.0.0
4340
*/
44-
public class MongoClientFactory {
41+
public class MongoClientFactory extends MongoClientFactorySupport<MongoClient> {
4542

46-
private final MongoProperties properties;
47-
48-
private final Environment environment;
49-
50-
public MongoClientFactory(MongoProperties properties, Environment environment) {
51-
this.properties = properties;
52-
this.environment = environment;
53-
}
54-
55-
/**
56-
* Creates a {@link MongoClient} using the given {@code options}. If the environment
57-
* contains a {@code local.mongo.port} property, it is used to configure a client to
58-
* an embedded MongoDB instance.
59-
* @param options the options
60-
* @return the Mongo client
61-
*/
62-
public MongoClient createMongoClient(MongoClientOptions options) {
63-
Integer embeddedPort = getEmbeddedPort();
64-
if (embeddedPort != null) {
65-
return createEmbeddedMongoClient(options, embeddedPort);
66-
}
67-
return createNetworkMongoClient(options);
68-
}
69-
70-
private Integer getEmbeddedPort() {
71-
if (this.environment != null) {
72-
String localPort = this.environment.getProperty("local.mongo.port");
73-
if (localPort != null) {
74-
return Integer.valueOf(localPort);
75-
}
76-
}
77-
return null;
78-
}
79-
80-
private MongoClient createEmbeddedMongoClient(MongoClientOptions options, int port) {
81-
if (options == null) {
82-
options = MongoClientOptions.builder().build();
83-
}
84-
String host = (this.properties.getHost() != null) ? this.properties.getHost() : "localhost";
85-
return new MongoClient(Collections.singletonList(new ServerAddress(host, port)), options);
86-
}
87-
88-
private MongoClient createNetworkMongoClient(MongoClientOptions options) {
89-
MongoProperties properties = this.properties;
90-
if (properties.getUri() != null) {
91-
return createMongoClient(properties.getUri(), options);
92-
}
93-
if (hasCustomAddress() || hasCustomCredentials()) {
94-
if (options == null) {
95-
options = MongoClientOptions.builder().build();
96-
}
97-
MongoCredential credentials = getCredentials(properties);
98-
String host = getValue(properties.getHost(), "localhost");
99-
int port = getValue(properties.getPort(), MongoProperties.DEFAULT_PORT);
100-
List<ServerAddress> seeds = Collections.singletonList(new ServerAddress(host, port));
101-
return (credentials != null) ? new MongoClient(seeds, credentials, options)
102-
: new MongoClient(seeds, options);
103-
}
104-
return createMongoClient(MongoProperties.DEFAULT_URI, options);
105-
}
106-
107-
private MongoClient createMongoClient(String uri, MongoClientOptions options) {
108-
return new MongoClient(new MongoClientURI(uri, builder(options)));
109-
}
110-
111-
private <T> T getValue(T value, T fallback) {
112-
return (value != null) ? value : fallback;
113-
}
114-
115-
private boolean hasCustomAddress() {
116-
return this.properties.getHost() != null || this.properties.getPort() != null;
117-
}
118-
119-
private MongoCredential getCredentials(MongoProperties properties) {
120-
if (!hasCustomCredentials()) {
121-
return null;
122-
}
123-
String username = properties.getUsername();
124-
String database = getValue(properties.getAuthenticationDatabase(), properties.getMongoClientDatabase());
125-
char[] password = properties.getPassword();
126-
return MongoCredential.createCredential(username, database, password);
43+
public MongoClientFactory(MongoProperties properties, Environment environment,
44+
List<MongoClientSettingsBuilderCustomizer> builderCustomizers) {
45+
super(properties, environment, builderCustomizers);
12746
}
12847

129-
private boolean hasCustomCredentials() {
130-
return this.properties.getUsername() != null && this.properties.getPassword() != null;
48+
protected MongoClient createNetworkMongoClient(MongoClientSettings settings) {
49+
return MongoClients.create(settings, driverInformation());
13150
}
13251

133-
private Builder builder(MongoClientOptions options) {
134-
if (options != null) {
135-
return MongoClientOptions.builder(options);
136-
}
137-
return MongoClientOptions.builder();
52+
@Override
53+
protected MongoClient createEmbeddedMongoClient(MongoClientSettings settings) {
54+
return MongoClients.create(settings, driverInformation());
13855
}
13956

14057
}

0 commit comments

Comments
 (0)