diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/MongoDbFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/MongoDbFactory.java
index 19ca9fe79..ef6c1423c 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/MongoDbFactory.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/MongoDbFactory.java
@@ -58,6 +58,11 @@ public interface MongoDbFactory extends CodecRegistryProvider, MongoSessionProvi
*/
PersistenceExceptionTranslator getExceptionTranslator();
+ /**
+ * Get the legacy database entry point. Please consider {@link #getDb()} instead.
+ *
+ * @return
+ */
DB getLegacyDb();
/**
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java
new file mode 100644
index 000000000..41688f1a4
--- /dev/null
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.mongodb.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.MongoDbFactory;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;
+import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
+import org.springframework.data.mongodb.core.convert.DbRefResolver;
+import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
+import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.lang.Nullable;
+
+import com.mongodb.client.MongoClient;
+
+/**
+ * Base class for Spring Data MongoDB configuration using JavaConfig with {@link com.mongodb.client.MongoClient}.
+ *
+ * @author Christoph Strobl
+ * @see MongoConfigurationSupport
+ * @since 2.1
+ */
+@Configuration
+public abstract class AbstractMongoClientConfiguration extends MongoConfigurationSupport {
+
+ /**
+ * Return the {@link MongoClient} instance to connect to. Annotate with {@link Bean} in case you want to expose a
+ * {@link MongoClient} instance to the {@link org.springframework.context.ApplicationContext}.
+ *
+ * @return
+ */
+ public abstract MongoClient mongoClient();
+
+ /**
+ * Creates a {@link MongoTemplate}.
+ *
+ * @return
+ */
+ @Bean
+ public MongoTemplate mongoTemplate() throws Exception {
+ return new MongoTemplate(mongoDbFactory(), mappingMongoConverter());
+ }
+
+ /**
+ * Creates a {@link SimpleMongoDbFactory} to be used by the {@link MongoTemplate}. Will use the {@link MongoClient}
+ * instance configured in {@link #mongoClient()}.
+ *
+ * @see #mongoClient()
+ * @see #mongoTemplate()
+ * @return
+ */
+ @Bean
+ public MongoDbFactory mongoDbFactory() {
+ return new SimpleMongoClientDbFactory(mongoClient(), getDatabaseName());
+ }
+
+ /**
+ * Return the base package to scan for mapped {@link Document}s. Will return the package name of the configuration
+ * class' (the concrete class, not this one here) by default. So if you have a {@code com.acme.AppConfig} extending
+ * {@link AbstractMongoClientConfiguration} the base package will be considered {@code com.acme} unless the method is
+ * overridden to implement alternate behavior.
+ *
+ * @return the base package to scan for mapped {@link Document} classes or {@literal null} to not enable scanning for
+ * entities.
+ * @deprecated use {@link #getMappingBasePackages()} instead.
+ */
+ @Deprecated
+ @Nullable
+ protected String getMappingBasePackage() {
+
+ Package mappingBasePackage = getClass().getPackage();
+ return mappingBasePackage == null ? null : mappingBasePackage.getName();
+ }
+
+ /**
+ * Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and
+ * {@link #mongoMappingContext()}. Will get {@link #customConversions()} applied.
+ *
+ * @see #customConversions()
+ * @see #mongoMappingContext()
+ * @see #mongoDbFactory()
+ * @return
+ * @throws Exception
+ */
+ @Bean
+ public MappingMongoConverter mappingMongoConverter() throws Exception {
+
+ DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
+ MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext());
+ converter.setCustomConversions(customConversions());
+
+ return converter;
+ }
+}
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoConfiguration.java
index b53a16c5c..e12041ccc 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoConfiguration.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoConfiguration.java
@@ -29,7 +29,10 @@ import org.springframework.lang.Nullable;
import com.mongodb.MongoClient;
/**
- * Base class for Spring Data MongoDB configuration using JavaConfig.
+ * Base class for Spring Data MongoDB configuration using JavaConfig with {@link com.mongodb.MongoClient}.
+ *
+ * INFO:In case you want to use {@link com.mongodb.client.MongoClients} for configuration please refer
+ * to {@link AbstractMongoClientConfiguration}.
*
* @author Mark Pollack
* @author Oliver Gierke
@@ -62,7 +65,7 @@ public abstract class AbstractMongoConfiguration extends MongoConfigurationSuppo
/**
* Creates a {@link SimpleMongoDbFactory} to be used by the {@link MongoTemplate}. Will use the {@link MongoClient}
- * instance configured in {@link #mongo()}.
+ * instance configured in {@link #mongoClient()}.
*
* @see #mongoClient()
* @see #mongoTemplate()
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbFactoryBase.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbFactoryBase.java
new file mode 100644
index 000000000..86d6ff862
--- /dev/null
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbFactoryBase.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.mongodb.core;
+
+import lombok.Value;
+
+import org.springframework.aop.framework.ProxyFactory;
+import org.springframework.dao.DataAccessException;
+import org.springframework.dao.support.PersistenceExceptionTranslator;
+import org.springframework.data.mongodb.MongoDbFactory;
+import org.springframework.data.mongodb.SessionAwareMethodInterceptor;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+
+import com.mongodb.ClientSessionOptions;
+import com.mongodb.DB;
+import com.mongodb.WriteConcern;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+
+/**
+ * Common base class for usage with both {@link com.mongodb.client.MongoClients} and {@link com.mongodb.MongoClient}.
+ *
+ * @author Christoph Strobl
+ * @since 2.1
+ */
+abstract class MongoDbFactoryBase implements MongoDbFactory {
+
+ private final T mongoClient;
+ private final String databaseName;
+ private final boolean mongoInstanceCreated;
+ private final PersistenceExceptionTranslator exceptionTranslator;
+
+ private @Nullable WriteConcern writeConcern;
+
+ protected MongoDbFactoryBase(T mongoClient, String databaseName, boolean mongoInstanceCreated,
+ PersistenceExceptionTranslator exceptionTranslator) {
+
+ Assert.notNull(mongoClient, "MongoClient must not be null!");
+ Assert.hasText(databaseName, "Database name must not be empty!");
+ Assert.isTrue(databaseName.matches("[^/\\\\.$\"\\s]+"),
+ "Database name must not contain slashes, dots, spaces, quotes, or dollar signs!");
+
+ this.mongoClient = mongoClient;
+ this.databaseName = databaseName;
+ this.mongoInstanceCreated = mongoInstanceCreated;
+ this.exceptionTranslator = exceptionTranslator;
+ }
+
+ /**
+ * Configures the {@link WriteConcern} to be used on the {@link DB} instance being created.
+ *
+ * @param writeConcern the writeConcern to set
+ */
+ public void setWriteConcern(WriteConcern writeConcern) {
+ this.writeConcern = writeConcern;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getDb()
+ */
+ public MongoDatabase getDb() throws DataAccessException {
+ return getDb(databaseName);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
+ */
+ @Override
+ public MongoDatabase getDb(String dbName) throws DataAccessException {
+
+ Assert.hasText(dbName, "Database name must not be empty.");
+
+ MongoDatabase db = doGetMongoDatabase(dbName);
+
+ if (writeConcern == null) {
+ return db;
+ }
+
+ return db.withWriteConcern(writeConcern);
+ }
+
+ public void destroy() throws Exception {
+ if (mongoInstanceCreated) {
+ closeClient();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
+ */
+ public PersistenceExceptionTranslator getExceptionTranslator() {
+ return this.exceptionTranslator;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.Session)
+ */
+ public MongoDbFactory withSession(ClientSession session) {
+ return new MongoDbFactoryBase.ClientSessionBoundMongoDbFactory(session, this);
+ }
+
+ protected abstract void closeClient();
+
+ protected abstract MongoDatabase doGetMongoDatabase(String dbName);
+
+ protected T getMongoClient() {
+ return mongoClient;
+ }
+
+ protected String getDefaultDatabaseName() {
+ return databaseName;
+ }
+
+ /**
+ * {@link ClientSession} bound {@link MongoDbFactory} decorating the database with a
+ * {@link SessionAwareMethodInterceptor}.
+ *
+ * @author Christoph Strobl
+ * @since 2.1
+ */
+ @Value
+ static class ClientSessionBoundMongoDbFactory implements MongoDbFactory {
+
+ ClientSession session;
+ MongoDbFactory delegate;
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getDb()
+ */
+ @Override
+ public MongoDatabase getDb() throws DataAccessException {
+ return proxyMongoDatabase(delegate.getDb());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
+ */
+ @Override
+ public MongoDatabase getDb(String dbName) throws DataAccessException {
+ return proxyMongoDatabase(delegate.getDb(dbName));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
+ */
+ @Override
+ public PersistenceExceptionTranslator getExceptionTranslator() {
+ return delegate.getExceptionTranslator();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getLegacyDb()
+ */
+ @Override
+ public DB getLegacyDb() {
+ return delegate.getLegacyDb();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
+ */
+ @Override
+ public ClientSession getSession(ClientSessionOptions options) {
+ return delegate.getSession(options);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.ClientSession)
+ */
+ @Override
+ public MongoDbFactory withSession(ClientSession session) {
+ return delegate.withSession(session);
+ }
+
+ private MongoDatabase proxyMongoDatabase(MongoDatabase database) {
+ return createProxyInstance(session, database, MongoDatabase.class);
+ }
+
+ private MongoDatabase proxyDatabase(com.mongodb.session.ClientSession session, MongoDatabase database) {
+ return createProxyInstance(session, database, MongoDatabase.class);
+ }
+
+ private MongoCollection proxyCollection(com.mongodb.session.ClientSession session, MongoCollection collection) {
+ return createProxyInstance(session, collection, MongoCollection.class);
+ }
+
+ private T createProxyInstance(com.mongodb.session.ClientSession session, T target, Class targetType) {
+
+ ProxyFactory factory = new ProxyFactory();
+ factory.setTarget(target);
+ factory.setInterfaces(targetType);
+ factory.setOpaque(true);
+
+ factory.addAdvice(new SessionAwareMethodInterceptor<>(session, target, ClientSession.class, MongoDatabase.class,
+ this::proxyDatabase, MongoCollection.class, this::proxyCollection));
+
+ return targetType.cast(factory.getProxy());
+ }
+ }
+
+}
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoClientDbFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoClientDbFactory.java
new file mode 100644
index 000000000..f03980957
--- /dev/null
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoClientDbFactory.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.mongodb.core;
+
+import org.springframework.beans.factory.DisposableBean;
+
+import com.mongodb.ClientSessionOptions;
+import com.mongodb.ConnectionString;
+import com.mongodb.DB;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoDatabase;
+
+/**
+ * Factory to create {@link MongoDatabase} instances from a {@link MongoClient} instance.
+ *
+ * @author Christoph Strobl
+ * @since 2.1
+ */
+public class SimpleMongoClientDbFactory extends MongoDbFactoryBase implements DisposableBean {
+
+ /**
+ * Creates a new {@link SimpleMongoClientDbFactory} instance for the given {@code connectionString}.
+ *
+ * @param connectionString must not be {@literal null}.
+ * @see MongoDB Connection String reference
+ */
+ public SimpleMongoClientDbFactory(String connectionString) {
+ this(new ConnectionString(connectionString));
+ }
+
+ /**
+ * Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
+ *
+ * @param connectionString must not be {@literal null}.
+ */
+ public SimpleMongoClientDbFactory(ConnectionString connectionString) {
+ this(MongoClients.create(connectionString), connectionString.getDatabase(), true);
+ }
+
+ /**
+ * Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
+ *
+ * @param mongoClient must not be {@literal null}.
+ * @param databaseName must not be {@literal null}.
+ */
+ public SimpleMongoClientDbFactory(MongoClient mongoClient, String databaseName) {
+ this(mongoClient, databaseName, false);
+ }
+
+ /**
+ * Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
+ *
+ * @param mongoClient must not be {@literal null}.
+ * @param databaseName must not be {@literal null}.
+ * @param mongoInstanceCreated
+ */
+ private SimpleMongoClientDbFactory(MongoClient mongoClient, String databaseName, boolean mongoInstanceCreated) {
+ super(mongoClient, databaseName, mongoInstanceCreated, new MongoExceptionTranslator());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getLegacyDb()
+ */
+ @Override
+ public DB getLegacyDb() {
+
+ throw new UnsupportedOperationException(String.format(
+ "%s does not support legacy DBObject API! Please " + "consider using SimpleMongoDbFactory for that purpose.",
+ MongoClient.class));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.MongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
+ */
+ @Override
+ public ClientSession getSession(ClientSessionOptions options) {
+ return getMongoClient().startSession(options);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.core.MongoDbFactoryBase#closeClient()
+ */
+ @Override
+ protected void closeClient() {
+ getMongoClient().close();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.mongodb.core.MongoDbFactoryBase#doGetMongoDatabase(java.lang.String)
+ */
+ @Override
+ protected MongoDatabase doGetMongoDatabase(String dbName) {
+ return getMongoClient().getDatabase(dbName);
+ }
+}
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java
index 67626cbcb..2e6eb1cd6 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/SimpleMongoDbFactory.java
@@ -15,16 +15,7 @@
*/
package org.springframework.data.mongodb.core;
-import lombok.Value;
-
-import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.DisposableBean;
-import org.springframework.dao.DataAccessException;
-import org.springframework.dao.support.PersistenceExceptionTranslator;
-import org.springframework.data.mongodb.MongoDbFactory;
-import org.springframework.data.mongodb.SessionAwareMethodInterceptor;
-import org.springframework.lang.Nullable;
-import org.springframework.util.Assert;
import com.mongodb.ClientSessionOptions;
import com.mongodb.DB;
@@ -45,14 +36,7 @@ import com.mongodb.client.MongoDatabase;
* @author George Moraitis
* @author Mark Paluch
*/
-public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
-
- private final MongoClient mongoClient;
- private final String databaseName;
- private final boolean mongoInstanceCreated;
- private final PersistenceExceptionTranslator exceptionTranslator;
-
- private @Nullable WriteConcern writeConcern;
+public class SimpleMongoDbFactory extends MongoDbFactoryBase implements DisposableBean {
/**
* Creates a new {@link SimpleMongoDbFactory} instance from the given {@link MongoClientURI}.
@@ -82,76 +66,12 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
* @since 1.7
*/
private SimpleMongoDbFactory(MongoClient mongoClient, String databaseName, boolean mongoInstanceCreated) {
-
- Assert.notNull(mongoClient, "MongoClient must not be null!");
- Assert.hasText(databaseName, "Database name must not be empty!");
- Assert.isTrue(databaseName.matches("[^/\\\\.$\"\\s]+"),
- "Database name must not contain slashes, dots, spaces, quotes, or dollar signs!");
-
- this.mongoClient = mongoClient;
- this.databaseName = databaseName;
- this.mongoInstanceCreated = mongoInstanceCreated;
- this.exceptionTranslator = new MongoExceptionTranslator();
+ super(mongoClient, databaseName, mongoInstanceCreated, new MongoExceptionTranslator());
}
- /**
- * Configures the {@link WriteConcern} to be used on the {@link DB} instance being created.
- *
- * @param writeConcern the writeConcern to set
- */
- public void setWriteConcern(WriteConcern writeConcern) {
- this.writeConcern = writeConcern;
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getDb()
- */
- public MongoDatabase getDb() throws DataAccessException {
- return getDb(databaseName);
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
- */
- public MongoDatabase getDb(String dbName) throws DataAccessException {
-
- Assert.hasText(dbName, "Database name must not be empty.");
-
- MongoDatabase db = mongoClient.getDatabase(dbName);
-
- if (writeConcern == null) {
- return db;
- }
-
- return db.withWriteConcern(writeConcern);
- }
-
- /**
- * Clean up the Mongo instance if it was created by the factory itself.
- *
- * @see DisposableBean#destroy()
- */
- public void destroy() throws Exception {
- if (mongoInstanceCreated) {
- mongoClient.close();
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
- */
- @Override
- public PersistenceExceptionTranslator getExceptionTranslator() {
- return this.exceptionTranslator;
- }
-
- @SuppressWarnings("deprecation")
@Override
public DB getLegacyDb() {
- return mongoClient.getDB(databaseName);
+ return getMongoClient().getDB(getDefaultDatabaseName());
}
/*
@@ -160,108 +80,16 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
*/
@Override
public ClientSession getSession(ClientSessionOptions options) {
- return mongoClient.startSession(options);
+ return getMongoClient().startSession(options);
}
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.ClientSession)
- */
@Override
- public MongoDbFactory withSession(ClientSession session) {
- return new ClientSessionBoundMongoDbFactory(session, this);
+ protected void closeClient() {
+ getMongoClient().close();
}
- /**
- * {@link ClientSession} bound {@link MongoDbFactory} decorating the database with a
- * {@link SessionAwareMethodInterceptor}.
- *
- * @author Christoph Strobl
- * @since 2.1
- */
- @Value
- static class ClientSessionBoundMongoDbFactory implements MongoDbFactory {
-
- ClientSession session;
- MongoDbFactory delegate;
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getDb()
- */
- @Override
- public MongoDatabase getDb() throws DataAccessException {
- return proxyMongoDatabase(delegate.getDb());
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
- */
- @Override
- public MongoDatabase getDb(String dbName) throws DataAccessException {
- return proxyMongoDatabase(delegate.getDb(dbName));
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
- */
- @Override
- public PersistenceExceptionTranslator getExceptionTranslator() {
- return delegate.getExceptionTranslator();
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getLegacyDb()
- */
- @Override
- public DB getLegacyDb() {
- return delegate.getLegacyDb();
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
- */
- @Override
- public ClientSession getSession(ClientSessionOptions options) {
- return delegate.getSession(options);
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.ClientSession)
- */
- @Override
- public MongoDbFactory withSession(ClientSession session) {
- return delegate.withSession(session);
- }
-
- private MongoDatabase proxyMongoDatabase(MongoDatabase database) {
- return createProxyInstance(session, database, MongoDatabase.class);
- }
-
- private MongoDatabase proxyDatabase(com.mongodb.session.ClientSession session, MongoDatabase database) {
- return createProxyInstance(session, database, MongoDatabase.class);
- }
-
- private MongoCollection proxyCollection(com.mongodb.session.ClientSession session, MongoCollection collection) {
- return createProxyInstance(session, collection, MongoCollection.class);
- }
-
- private T createProxyInstance(com.mongodb.session.ClientSession session, T target, Class targetType) {
-
- ProxyFactory factory = new ProxyFactory();
- factory.setTarget(target);
- factory.setInterfaces(targetType);
- factory.setOpaque(true);
-
- factory.addAdvice(new SessionAwareMethodInterceptor<>(session, target, ClientSession.class, MongoDatabase.class, this::proxyDatabase,
- MongoCollection.class, this::proxyCollection));
-
- return targetType.cast(factory.getProxy());
- }
+ @Override
+ protected MongoDatabase doGetMongoDatabase(String dbName) {
+ return getMongoClient().getDatabase(dbName);
}
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java
index 775cec8a1..abfbc250f 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java
@@ -30,9 +30,9 @@ import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import com.mongodb.Mongo;
-import com.mongodb.MongoClient;
import com.mongodb.MongoException;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
/**
@@ -43,7 +43,7 @@ import com.mongodb.client.MongoCollection;
public abstract class AbstractIntegrationTests {
@Configuration
- static class TestConfig extends AbstractMongoConfiguration {
+ static class TestConfig extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
@@ -52,7 +52,7 @@ public abstract class AbstractIntegrationTests {
@Override
public MongoClient mongoClient() {
- return new MongoClient();
+ return MongoClients.create();
}
}
diff --git a/src/main/asciidoc/reference/mongodb.adoc b/src/main/asciidoc/reference/mongodb.adoc
index 07ecdc9fd..653e32a95 100644
--- a/src/main/asciidoc/reference/mongodb.adoc
+++ b/src/main/asciidoc/reference/mongodb.adoc
@@ -366,6 +366,28 @@ NOTE: Username/password credentials used in XML configuration must be URL encode
Example: `m0ng0@dmin:mo_res:bw6},Qsdxx@admin@database` -> `m0ng0%40dmin:mo_res%3Abw6%7D%2CQsdxx%40admin@database`
See https://tools.ietf.org/html/rfc3986#section-2.2[section 2.2 of RFC 3986] for further details.
+As of MongoDB java driver 3.7.0 there is an alternative entry point to `MongoClient` via the http://search.maven
+.org/#search%7Cgav%7C1%7Cg%3A%22org.mongodb%22%20AND%20a%3A%22mongodb-driver-sync%22[mongodb-driver-sync] artifact.
+`com.mongodb.client.MongoClient` is *not* compatible with `com.mongodb.MongoClient` and does not longer support
+the legacy `DBObject` codec. Therefore it cannot be used with `Querydsl` and requires a different configuration.
+You may use `AbstractMongoClientConfiguration` to leverage the new `MongoClients` builder API.
+
+[source,java]
+----
+@Configuration
+public class MongoClientConfiguration extends AbstractMongoClientConfiguration {
+
+ @Override
+ protected String getDatabaseName() {
+ return "database";
+ }
+
+ @Override
+ public MongoClient mongoClient() {
+ return MongoClients.create("mongodb://localhost:27017/?replicaSet=rs0&w=majority");
+ }
+}
+----
[[mongo.mongo-db-factory-xml]]
=== Registering a MongoDbFactory instance using XML based metadata