Browse Source

DATAMONGO-2427 - Polishing.

Replace leftovers to Mongo 2.x API with Document and MongoDatabase references and tweak Javadoc. Reorder field declarations to class header. Reflect 3.0 versions in schema configuration. Add TODO markers to disabled tests.
Reflect changes in documentation.

Enable disabled test.

Original pull request: #823.
pull/830/head
Mark Paluch 6 years ago
parent
commit
6049541d0a
No known key found for this signature in database
GPG Key ID: 51A00FA751B91849
  1. 18
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientFactoryBean.java
  2. 133
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientSettingsFactoryBean.java
  3. 3
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  4. 1
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoClientSettingsFactoryBean.java
  5. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java
  6. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/PartialIndexFilter.java
  7. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceOptions.java
  8. 3
      spring-data-mongodb/src/main/resources/META-INF/spring.schemas
  9. 1
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientNamespaceTests.java
  10. 18
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceTests.java
  11. 24
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoClientFactoryBeanUnitTests.java
  12. 2
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoClientSettingsFactoryBeanUnitTests.java
  13. 2
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java
  14. 8
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SimpleMongoClientDatabaseFactoryUnitTests.java
  15. 1
      src/main/asciidoc/new-features.adoc
  16. 11
      src/main/asciidoc/preface.adoc
  17. 6
      src/main/asciidoc/reference/client-session-transactions.adoc
  18. 8
      src/main/asciidoc/reference/mapping.adoc
  19. 5
      src/main/asciidoc/reference/migrating.adoc
  20. 11
      src/main/asciidoc/reference/mongo-3.adoc
  21. 4
      src/main/asciidoc/reference/mongo-repositories.adoc
  22. 38
      src/main/asciidoc/reference/mongodb.adoc
  23. 2
      src/main/asciidoc/upgrading.adoc

18
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientFactoryBean.java

@ -144,10 +144,12 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
} }
/** /**
* Create {@link MongoClientSettings} based on configuration and priority (lower is better). <br /> * Create {@link MongoClientSettings} based on configuration and priority (lower is better).
* 1. {@link MongoClientFactoryBean#mongoClientSettings} <br /> * <ol>
* 2. {@link MongoClientFactoryBean#connectionString} <br /> * <li>{@link MongoClientFactoryBean#mongoClientSettings}</li>
* 3. default {@link MongoClientSettings} * <li>{@link MongoClientFactoryBean#connectionString}</li>
* <li>default {@link MongoClientSettings}</li>
* </ol>
* *
* @since 3.0 * @since 3.0
*/ */
@ -220,7 +222,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
}) // }) //
.applyToConnectionPoolSettings(settings -> { .applyToConnectionPoolSettings(settings -> {
applySettings(it -> settings.maintenanceFrequency(it.longValue(), TimeUnit.MILLISECONDS), applySettings(it -> settings.maintenanceFrequency(it, TimeUnit.MILLISECONDS),
computeSettingsValue((ConnectionPoolSettings it) -> it.getMaintenanceFrequency(TimeUnit.MILLISECONDS), computeSettingsValue((ConnectionPoolSettings it) -> it.getMaintenanceFrequency(TimeUnit.MILLISECONDS),
defaultSettings.getConnectionPoolSettings(), connectionPoolSettings, null)); defaultSettings.getConnectionPoolSettings(), connectionPoolSettings, null));
@ -239,7 +241,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
defaultSettings.getConnectionPoolSettings(), connectionPoolSettings, defaultSettings.getConnectionPoolSettings(), connectionPoolSettings,
connectionString.getMaxWaitTime())); connectionString.getMaxWaitTime()));
applySettings(it -> settings.maintenanceInitialDelay(it.longValue(), TimeUnit.MILLISECONDS), applySettings(it -> settings.maintenanceInitialDelay(it, TimeUnit.MILLISECONDS),
computeSettingsValue( computeSettingsValue(
(ConnectionPoolSettings it) -> it.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS), (ConnectionPoolSettings it) -> it.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS),
defaultSettings.getConnectionPoolSettings(), connectionPoolSettings, null)); defaultSettings.getConnectionPoolSettings(), connectionPoolSettings, null));
@ -253,11 +255,11 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
}) // }) //
.applyToSocketSettings(settings -> { .applyToSocketSettings(settings -> {
applySettings(it -> settings.connectTimeout(it.intValue(), TimeUnit.MILLISECONDS), applySettings(it -> settings.connectTimeout(it, TimeUnit.MILLISECONDS),
computeSettingsValue((SocketSettings it) -> it.getConnectTimeout(TimeUnit.MILLISECONDS), computeSettingsValue((SocketSettings it) -> it.getConnectTimeout(TimeUnit.MILLISECONDS),
defaultSettings.getSocketSettings(), socketSettings, connectionString.getConnectTimeout())); defaultSettings.getSocketSettings(), socketSettings, connectionString.getConnectTimeout()));
applySettings(it -> settings.readTimeout(it.intValue(), TimeUnit.MILLISECONDS), applySettings(it -> settings.readTimeout(it, TimeUnit.MILLISECONDS),
computeSettingsValue((SocketSettings it) -> it.getReadTimeout(TimeUnit.MILLISECONDS), computeSettingsValue((SocketSettings it) -> it.getReadTimeout(TimeUnit.MILLISECONDS),
defaultSettings.getSocketSettings(), socketSettings, connectionString.getSocketTimeout())); defaultSettings.getSocketSettings(), socketSettings, connectionString.getSocketTimeout()));
applySettings(settings::receiveBufferSize, computeSettingsValue(SocketSettings::getReceiveBufferSize, applySettings(settings::receiveBufferSize, computeSettingsValue(SocketSettings::getReceiveBufferSize,

133
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientSettingsFactoryBean.java

@ -24,10 +24,10 @@ import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.configuration.CodecRegistry;
import org.springframework.beans.factory.config.AbstractFactoryBean; import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.mongodb.AutoEncryptionSettings; import com.mongodb.AutoEncryptionSettings;
@ -45,6 +45,7 @@ import com.mongodb.connection.StreamFactoryFactory;
* A factory bean for construction of a {@link MongoClientSettings} instance to be used with a MongoDB driver. * A factory bean for construction of a {@link MongoClientSettings} instance to be used with a MongoDB driver.
* *
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch
* @since 3.0 * @since 3.0
*/ */
public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoClientSettings> { public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoClientSettings> {
@ -65,18 +66,57 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
// --> Socket Settings // --> Socket Settings
private Integer socketConnectTimeoutMS = DEFAULT_MONGO_SETTINGS.getSocketSettings() private int socketConnectTimeoutMS = DEFAULT_MONGO_SETTINGS.getSocketSettings()
.getConnectTimeout(TimeUnit.MILLISECONDS); .getConnectTimeout(TimeUnit.MILLISECONDS);
private Integer socketReadTimeoutMS = DEFAULT_MONGO_SETTINGS.getSocketSettings() private int socketReadTimeoutMS = DEFAULT_MONGO_SETTINGS.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS);
.getReadTimeout(TimeUnit.MILLISECONDS); private int socketReceiveBufferSize = DEFAULT_MONGO_SETTINGS.getSocketSettings().getReceiveBufferSize();
private Integer socketReceiveBufferSize = DEFAULT_MONGO_SETTINGS.getSocketSettings().getReceiveBufferSize(); private int socketSendBufferSize = DEFAULT_MONGO_SETTINGS.getSocketSettings().getSendBufferSize();
private Integer socketSendBufferSize = DEFAULT_MONGO_SETTINGS.getSocketSettings().getSendBufferSize();
// --> Cluster Settings
private @Nullable String clusterSrvHost = DEFAULT_MONGO_SETTINGS.getClusterSettings().getSrvHost();
private List<ServerAddress> clusterHosts = Collections.emptyList();
private @Nullable ClusterConnectionMode clusterConnectionMode = null;
private ClusterType custerRequiredClusterType = DEFAULT_MONGO_SETTINGS.getClusterSettings().getRequiredClusterType();
private String clusterRequiredReplicaSetName = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getRequiredReplicaSetName();
private long clusterLocalThresholdMS = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getLocalThreshold(TimeUnit.MILLISECONDS);
private long clusterServerSelectionTimeoutMS = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getServerSelectionTimeout(TimeUnit.MILLISECONDS);
// --> ConnectionPoolSettings
private int poolMaxSize = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings().getMaxSize();
private int poolMinSize = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings().getMinSize();
private long poolMaxWaitTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxWaitTime(TimeUnit.MILLISECONDS);
private long poolMaxConnectionLifeTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxConnectionLifeTime(TimeUnit.MILLISECONDS);
private long poolMaxConnectionIdleTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS);
private long poolMaintenanceInitialDelayMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS);
private long poolMaintenanceFrequencyMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaintenanceFrequency(TimeUnit.MILLISECONDS);
// --> SSL Settings
private boolean sslEnabled = DEFAULT_MONGO_SETTINGS.getSslSettings().isEnabled();
private boolean sslInvalidHostNameAllowed = DEFAULT_MONGO_SETTINGS.getSslSettings().isInvalidHostNameAllowed();
private String sslProvider = DEFAULT_MONGO_SETTINGS.getSslSettings().isEnabled()
? DEFAULT_MONGO_SETTINGS.getSslSettings().getContext().getProvider().getName()
: "";
// encryption and retry
private @Nullable AutoEncryptionSettings autoEncryptionSettings;
/** /**
* @param socketConnectTimeoutMS in msec * @param socketConnectTimeoutMS in msec
* @see com.mongodb.connection.SocketSettings.Builder#connectTimeout(int, TimeUnit) * @see com.mongodb.connection.SocketSettings.Builder#connectTimeout(int, TimeUnit)
*/ */
public void setSocketConnectTimeoutMS(Integer socketConnectTimeoutMS) { public void setSocketConnectTimeoutMS(int socketConnectTimeoutMS) {
this.socketConnectTimeoutMS = socketConnectTimeoutMS; this.socketConnectTimeoutMS = socketConnectTimeoutMS;
} }
@ -84,7 +124,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param socketReadTimeoutMS in msec * @param socketReadTimeoutMS in msec
* @see com.mongodb.connection.SocketSettings.Builder#readTimeout(int, TimeUnit) * @see com.mongodb.connection.SocketSettings.Builder#readTimeout(int, TimeUnit)
*/ */
public void setSocketReadTimeoutMS(Integer socketReadTimeoutMS) { public void setSocketReadTimeoutMS(int socketReadTimeoutMS) {
this.socketReadTimeoutMS = socketReadTimeoutMS; this.socketReadTimeoutMS = socketReadTimeoutMS;
} }
@ -92,7 +132,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param socketReceiveBufferSize * @param socketReceiveBufferSize
* @see com.mongodb.connection.SocketSettings.Builder#receiveBufferSize(int) * @see com.mongodb.connection.SocketSettings.Builder#receiveBufferSize(int)
*/ */
public void setSocketReceiveBufferSize(Integer socketReceiveBufferSize) { public void setSocketReceiveBufferSize(int socketReceiveBufferSize) {
this.socketReceiveBufferSize = socketReceiveBufferSize; this.socketReceiveBufferSize = socketReceiveBufferSize;
} }
@ -100,22 +140,22 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param socketSendBufferSize * @param socketSendBufferSize
* @see com.mongodb.connection.SocketSettings.Builder#sendBufferSize(int) * @see com.mongodb.connection.SocketSettings.Builder#sendBufferSize(int)
*/ */
public void setSocketSendBufferSize(Integer socketSendBufferSize) { public void setSocketSendBufferSize(int socketSendBufferSize) {
this.socketSendBufferSize = socketSendBufferSize; this.socketSendBufferSize = socketSendBufferSize;
} }
// --> Server Settings // --> Server Settings
private Long serverHeartbeatFrequencyMS = DEFAULT_MONGO_SETTINGS.getServerSettings() private long serverHeartbeatFrequencyMS = DEFAULT_MONGO_SETTINGS.getServerSettings()
.getHeartbeatFrequency(TimeUnit.MILLISECONDS); .getHeartbeatFrequency(TimeUnit.MILLISECONDS);
private Long serverMinHeartbeatFrequencyMS = DEFAULT_MONGO_SETTINGS.getServerSettings() private long serverMinHeartbeatFrequencyMS = DEFAULT_MONGO_SETTINGS.getServerSettings()
.getMinHeartbeatFrequency(TimeUnit.MILLISECONDS); .getMinHeartbeatFrequency(TimeUnit.MILLISECONDS);
/** /**
* @param serverHeartbeatFrequencyMS in msec * @param serverHeartbeatFrequencyMS in msec
* @see com.mongodb.connection.ServerSettings.Builder#heartbeatFrequency(long, TimeUnit) * @see com.mongodb.connection.ServerSettings.Builder#heartbeatFrequency(long, TimeUnit)
*/ */
public void setServerHeartbeatFrequencyMS(Long serverHeartbeatFrequencyMS) { public void setServerHeartbeatFrequencyMS(long serverHeartbeatFrequencyMS) {
this.serverHeartbeatFrequencyMS = serverHeartbeatFrequencyMS; this.serverHeartbeatFrequencyMS = serverHeartbeatFrequencyMS;
} }
@ -123,23 +163,12 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param serverMinHeartbeatFrequencyMS in msec * @param serverMinHeartbeatFrequencyMS in msec
* @see com.mongodb.connection.ServerSettings.Builder#minHeartbeatFrequency(long, TimeUnit) * @see com.mongodb.connection.ServerSettings.Builder#minHeartbeatFrequency(long, TimeUnit)
*/ */
public void setServerMinHeartbeatFrequencyMS(Long serverMinHeartbeatFrequencyMS) { public void setServerMinHeartbeatFrequencyMS(long serverMinHeartbeatFrequencyMS) {
this.serverMinHeartbeatFrequencyMS = serverMinHeartbeatFrequencyMS; this.serverMinHeartbeatFrequencyMS = serverMinHeartbeatFrequencyMS;
} }
// --> Cluster Settings // --> Cluster Settings
private @Nullable String clusterSrvHost = DEFAULT_MONGO_SETTINGS.getClusterSettings().getSrvHost();
private List<ServerAddress> clusterHosts = Collections.emptyList();
private @Nullable ClusterConnectionMode clusterConnectionMode = null;
private ClusterType custerRequiredClusterType = DEFAULT_MONGO_SETTINGS.getClusterSettings().getRequiredClusterType();
private String clusterRequiredReplicaSetName = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getRequiredReplicaSetName();
private long clusterLocalThresholdMS = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getLocalThreshold(TimeUnit.MILLISECONDS);
private long clusterServerSelectionTimeoutMS = DEFAULT_MONGO_SETTINGS.getClusterSettings()
.getServerSelectionTimeout(TimeUnit.MILLISECONDS);
/** /**
* @param clusterSrvHost * @param clusterSrvHost
* @see com.mongodb.connection.ClusterSettings.Builder#srvHost(String) * @see com.mongodb.connection.ClusterSettings.Builder#srvHost(String)
@ -158,7 +187,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
/** /**
* ???? * ????
* *
* @param clusterConnectionMode * @param clusterConnectionMode
* @see com.mongodb.connection.ClusterSettings.Builder#mode(ClusterConnectionMode) * @see com.mongodb.connection.ClusterSettings.Builder#mode(ClusterConnectionMode)
*/ */
@ -200,24 +229,11 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
// --> ConnectionPoolSettings // --> ConnectionPoolSettings
private Integer poolMaxSize = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings().getMaxSize();
private Integer poolMinSize = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings().getMinSize();
private Long poolMaxWaitTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxWaitTime(TimeUnit.MILLISECONDS);
private Long poolMaxConnectionLifeTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxConnectionLifeTime(TimeUnit.MILLISECONDS);
private Long poolMaxConnectionIdleTimeMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS);
private Long poolMaintenanceInitialDelayMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS);
private Long poolMaintenanceFrequencyMS = DEFAULT_MONGO_SETTINGS.getConnectionPoolSettings()
.getMaintenanceFrequency(TimeUnit.MILLISECONDS);
/** /**
* @param poolMaxSize * @param poolMaxSize
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxSize(int) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxSize(int)
*/ */
public void setPoolMaxSize(Integer poolMaxSize) { public void setPoolMaxSize(int poolMaxSize) {
this.poolMaxSize = poolMaxSize; this.poolMaxSize = poolMaxSize;
} }
@ -225,7 +241,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMinSize * @param poolMinSize
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#minSize(int) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#minSize(int)
*/ */
public void setPoolMinSize(Integer poolMinSize) { public void setPoolMinSize(int poolMinSize) {
this.poolMinSize = poolMinSize; this.poolMinSize = poolMinSize;
} }
@ -233,7 +249,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMaxWaitTimeMS in mesec * @param poolMaxWaitTimeMS in mesec
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxWaitTime(long, TimeUnit) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxWaitTime(long, TimeUnit)
*/ */
public void setPoolMaxWaitTimeMS(Long poolMaxWaitTimeMS) { public void setPoolMaxWaitTimeMS(long poolMaxWaitTimeMS) {
this.poolMaxWaitTimeMS = poolMaxWaitTimeMS; this.poolMaxWaitTimeMS = poolMaxWaitTimeMS;
} }
@ -241,7 +257,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMaxConnectionLifeTimeMS in msec * @param poolMaxConnectionLifeTimeMS in msec
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxConnectionLifeTime(long, TimeUnit) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxConnectionLifeTime(long, TimeUnit)
*/ */
public void setPoolMaxConnectionLifeTimeMS(Long poolMaxConnectionLifeTimeMS) { public void setPoolMaxConnectionLifeTimeMS(long poolMaxConnectionLifeTimeMS) {
this.poolMaxConnectionLifeTimeMS = poolMaxConnectionLifeTimeMS; this.poolMaxConnectionLifeTimeMS = poolMaxConnectionLifeTimeMS;
} }
@ -249,7 +265,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMaxConnectionIdleTimeMS in msec * @param poolMaxConnectionIdleTimeMS in msec
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxConnectionIdleTime(long, TimeUnit) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maxConnectionIdleTime(long, TimeUnit)
*/ */
public void setPoolMaxConnectionIdleTimeMS(Long poolMaxConnectionIdleTimeMS) { public void setPoolMaxConnectionIdleTimeMS(long poolMaxConnectionIdleTimeMS) {
this.poolMaxConnectionIdleTimeMS = poolMaxConnectionIdleTimeMS; this.poolMaxConnectionIdleTimeMS = poolMaxConnectionIdleTimeMS;
} }
@ -257,7 +273,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMaintenanceInitialDelayMS in msec * @param poolMaintenanceInitialDelayMS in msec
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maintenanceInitialDelay(long, TimeUnit) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maintenanceInitialDelay(long, TimeUnit)
*/ */
public void setPoolMaintenanceInitialDelayMS(Long poolMaintenanceInitialDelayMS) { public void setPoolMaintenanceInitialDelayMS(long poolMaintenanceInitialDelayMS) {
this.poolMaintenanceInitialDelayMS = poolMaintenanceInitialDelayMS; this.poolMaintenanceInitialDelayMS = poolMaintenanceInitialDelayMS;
} }
@ -265,18 +281,12 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
* @param poolMaintenanceFrequencyMS in msec * @param poolMaintenanceFrequencyMS in msec
* @see com.mongodb.connection.ConnectionPoolSettings.Builder#maintenanceFrequency(long, TimeUnit) * @see com.mongodb.connection.ConnectionPoolSettings.Builder#maintenanceFrequency(long, TimeUnit)
*/ */
public void setPoolMaintenanceFrequencyMS(Long poolMaintenanceFrequencyMS) { public void setPoolMaintenanceFrequencyMS(long poolMaintenanceFrequencyMS) {
this.poolMaintenanceFrequencyMS = poolMaintenanceFrequencyMS; this.poolMaintenanceFrequencyMS = poolMaintenanceFrequencyMS;
} }
// --> SSL Settings // --> SSL Settings
private Boolean sslEnabled = DEFAULT_MONGO_SETTINGS.getSslSettings().isEnabled();
private Boolean sslInvalidHostNameAllowed = DEFAULT_MONGO_SETTINGS.getSslSettings().isInvalidHostNameAllowed();
private String sslProvider = DEFAULT_MONGO_SETTINGS.getSslSettings().isEnabled()
? DEFAULT_MONGO_SETTINGS.getSslSettings().getContext().getProvider().getName()
: "";
/** /**
* @param sslEnabled * @param sslEnabled
* @see com.mongodb.connection.SslSettings.Builder#enabled(boolean) * @see com.mongodb.connection.SslSettings.Builder#enabled(boolean)
@ -304,8 +314,6 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
// encryption and retry // encryption and retry
private @Nullable AutoEncryptionSettings autoEncryptionSettings;
/** /**
* @param applicationName * @param applicationName
* @see MongoClientSettings.Builder#applicationName(String) * @see MongoClientSettings.Builder#applicationName(String)
@ -392,11 +400,11 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
.readConcern(readConcern) // .readConcern(readConcern) //
.codecRegistry(codecRegistry) // .codecRegistry(codecRegistry) //
.applicationName(applicationName) // .applicationName(applicationName) //
.autoEncryptionSettings(autoEncryptionSettings)// .autoEncryptionSettings(autoEncryptionSettings) //
.applyToClusterSettings((settings) -> { .applyToClusterSettings((settings) -> {
settings.serverSelectionTimeout(clusterServerSelectionTimeoutMS, TimeUnit.MILLISECONDS); settings.serverSelectionTimeout(clusterServerSelectionTimeoutMS, TimeUnit.MILLISECONDS);
if(clusterConnectionMode != null) { if (clusterConnectionMode != null) {
settings.mode(clusterConnectionMode); settings.mode(clusterConnectionMode);
} }
settings.requiredReplicaSetName(clusterRequiredReplicaSetName); settings.requiredReplicaSetName(clusterRequiredReplicaSetName);
@ -405,7 +413,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
settings.hosts(clusterHosts); settings.hosts(clusterHosts);
} }
settings.localThreshold(clusterLocalThresholdMS, TimeUnit.MILLISECONDS); settings.localThreshold(clusterLocalThresholdMS, TimeUnit.MILLISECONDS);
// settings.maxWaitQueueSize(clusterMaxWaitQueueSize); // settings.maxWaitQueueSize(clusterMaxWaitQueueSize);
settings.requiredClusterType(custerRequiredClusterType); settings.requiredClusterType(custerRequiredClusterType);
if (StringUtils.hasText(clusterSrvHost)) { if (StringUtils.hasText(clusterSrvHost)) {
@ -419,7 +427,7 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
settings.maxConnectionIdleTime(poolMaxConnectionIdleTimeMS, TimeUnit.MILLISECONDS); settings.maxConnectionIdleTime(poolMaxConnectionIdleTimeMS, TimeUnit.MILLISECONDS);
settings.maxWaitTime(poolMaxWaitTimeMS, TimeUnit.MILLISECONDS); settings.maxWaitTime(poolMaxWaitTimeMS, TimeUnit.MILLISECONDS);
settings.maxConnectionLifeTime(poolMaxConnectionLifeTimeMS, TimeUnit.MILLISECONDS); settings.maxConnectionLifeTime(poolMaxConnectionLifeTimeMS, TimeUnit.MILLISECONDS);
// settings.maxWaitQueueSize(poolMaxWaitQueueSize); // settings.maxWaitQueueSize(poolMaxWaitQueueSize);
settings.maintenanceFrequency(poolMaintenanceFrequencyMS, TimeUnit.MILLISECONDS); settings.maintenanceFrequency(poolMaintenanceFrequencyMS, TimeUnit.MILLISECONDS);
settings.maintenanceInitialDelay(poolMaintenanceInitialDelayMS, TimeUnit.MILLISECONDS); settings.maintenanceInitialDelay(poolMaintenanceInitialDelayMS, TimeUnit.MILLISECONDS);
}) // }) //
@ -430,19 +438,20 @@ public class MongoClientSettingsFactoryBean extends AbstractFactoryBean<MongoCli
}) // }) //
.applyToSocketSettings((settings) -> { .applyToSocketSettings((settings) -> {
settings.connectTimeout(socketConnectTimeoutMS.intValue(), TimeUnit.MILLISECONDS); settings.connectTimeout(socketConnectTimeoutMS, TimeUnit.MILLISECONDS);
settings.readTimeout(socketReadTimeoutMS.intValue(), TimeUnit.MILLISECONDS); settings.readTimeout(socketReadTimeoutMS, TimeUnit.MILLISECONDS);
settings.receiveBufferSize(socketReceiveBufferSize); settings.receiveBufferSize(socketReceiveBufferSize);
settings.sendBufferSize(socketSendBufferSize); settings.sendBufferSize(socketSendBufferSize);
}) // }) //
.applyToSslSettings((settings) -> { .applyToSslSettings((settings) -> {
settings.enabled(sslEnabled); settings.enabled(sslEnabled);
if (ObjectUtils.nullSafeEquals(Boolean.TRUE, sslEnabled)) { if (sslEnabled) {
settings.invalidHostNameAllowed(sslInvalidHostNameAllowed); settings.invalidHostNameAllowed(sslInvalidHostNameAllowed);
try { try {
settings.context(StringUtils.hasText(sslProvider) ? SSLContext.getInstance(sslProvider) : SSLContext.getDefault()); settings.context(
StringUtils.hasText(sslProvider) ? SSLContext.getInstance(sslProvider) : SSLContext.getDefault());
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
throw new IllegalArgumentException(e.getMessage(), e); throw new IllegalArgumentException(e.getMessage(), e);
} }

3
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

@ -17,6 +17,7 @@ package org.springframework.data.mongodb.core;
import static org.springframework.data.mongodb.core.query.SerializationUtils.*; import static org.springframework.data.mongodb.core.query.SerializationUtils.*;
import com.mongodb.client.MongoClient;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.NonNull; import lombok.NonNull;
@ -213,7 +214,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
* @param databaseName must not be {@literal null} or empty. * @param databaseName must not be {@literal null} or empty.
* @since 2.1 * @since 2.1
*/ */
public MongoTemplate(com.mongodb.client.MongoClient mongoClient, String databaseName) { public MongoTemplate(MongoClient mongoClient, String databaseName) {
this(new SimpleMongoClientDatabaseFactory(mongoClient, databaseName), (MongoConverter) null); this(new SimpleMongoClientDatabaseFactory(mongoClient, databaseName), (MongoConverter) null);
} }

1
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoClientSettingsFactoryBean.java

@ -21,6 +21,7 @@ import com.mongodb.MongoClientSettings;
* A factory bean for construction of a {@link MongoClientSettings} instance to be used with the async MongoDB driver. * A factory bean for construction of a {@link MongoClientSettings} instance to be used with the async MongoDB driver.
* *
* @author Mark Paluch * @author Mark Paluch
* @author Christoph Strobl
* @since 2.0 * @since 2.0
* @deprecated since 3.0 - Use {@link MongoClientSettingsFactoryBean} instead. * @deprecated since 3.0 - Use {@link MongoClientSettingsFactoryBean} instead.
*/ */

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java

@ -23,8 +23,6 @@ import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import com.mongodb.DBObject;
/** /**
* Holds a set of configurable aggregation options that can be used within an aggregation pipeline. A list of support * Holds a set of configurable aggregation options that can be used within an aggregation pipeline. A list of support
* aggregation options can be found in the MongoDB reference documentation * aggregation options can be found in the MongoDB reference documentation
@ -115,7 +113,7 @@ public class AggregationOptions {
} }
/** /**
* Creates new {@link AggregationOptions} given {@link DBObject} containing aggregation options. * Creates new {@link AggregationOptions} given {@link Document} containing aggregation options.
* *
* @param document must not be {@literal null}. * @param document must not be {@literal null}.
* @return the {@link AggregationOptions}. * @return the {@link AggregationOptions}.

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/PartialIndexFilter.java

@ -26,7 +26,7 @@ import org.springframework.data.mongodb.core.query.CriteriaDefinition;
import com.mongodb.DBObject; import com.mongodb.DBObject;
/** /**
* {@link IndexFilter} implementation for usage with plain {@link DBObject} as well as {@link CriteriaDefinition} filter * {@link IndexFilter} implementation for usage with plain {@link Document} as well as {@link CriteriaDefinition} filter
* expressions. * expressions.
* *
* @author Christoph Strobl * @author Christoph Strobl
@ -38,7 +38,7 @@ public class PartialIndexFilter implements IndexFilter {
private final @NonNull Object filterExpression; private final @NonNull Object filterExpression;
/** /**
* Create new {@link PartialIndexFilter} for given {@link DBObject filter expression}. * Create new {@link PartialIndexFilter} for given {@link Document filter expression}.
* *
* @param where must not be {@literal null}. * @param where must not be {@literal null}.
* @return * @return

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceOptions.java

@ -358,7 +358,7 @@ public class MapReduceOptions {
} }
/** /**
* @return {@literal true} if {@literal inline} output shall is used. * @return {@literal true} if {@literal inline} output is used.
* @since 2.0.10 * @since 2.0.10
*/ */
public boolean usesInlineOutput() { public boolean usesInlineOutput() {

3
spring-data-mongodb/src/main/resources/META-INF/spring.schemas

@ -10,7 +10,8 @@ http\://www.springframework.org/schema/data/mongo/spring-mongo-1.10.xsd=org/spri
http\://www.springframework.org/schema/data/mongo/spring-mongo-1.10.2.xsd=org/springframework/data/mongodb/config/spring-mongo-1.10.2.xsd http\://www.springframework.org/schema/data/mongo/spring-mongo-1.10.2.xsd=org/springframework/data/mongodb/config/spring-mongo-1.10.2.xsd
http\://www.springframework.org/schema/data/mongo/spring-mongo-2.0.xsd=org/springframework/data/mongodb/config/spring-mongo-2.0.xsd http\://www.springframework.org/schema/data/mongo/spring-mongo-2.0.xsd=org/springframework/data/mongodb/config/spring-mongo-2.0.xsd
http\://www.springframework.org/schema/data/mongo/spring-mongo-2.2.xsd=org/springframework/data/mongodb/config/spring-mongo-2.0.xsd http\://www.springframework.org/schema/data/mongo/spring-mongo-2.2.xsd=org/springframework/data/mongodb/config/spring-mongo-2.0.xsd
http\://www.springframework.org/schema/data/mongo/spring-mongo.xsd=org/springframework/data/mongodb/config/spring-mongo-2.2.xsd http\://www.springframework.org/schema/data/mongo/spring-mongo-3.0.xsd=org/springframework/data/mongodb/config/spring-mongo-3.0.xsd
http\://www.springframework.org/schema/data/mongo/spring-mongo.xsd=org/springframework/data/mongodb/config/spring-mongo-3.0.xsd
https\://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd=org/springframework/data/mongodb/config/spring-mongo-1.0.xsd https\://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd=org/springframework/data/mongodb/config/spring-mongo-1.0.xsd
https\://www.springframework.org/schema/data/mongo/spring-mongo-1.1.xsd=org/springframework/data/mongodb/config/spring-mongo-1.1.xsd https\://www.springframework.org/schema/data/mongo/spring-mongo-1.1.xsd=org/springframework/data/mongodb/config/spring-mongo-1.1.xsd
https\://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd=org/springframework/data/mongodb/config/spring-mongo-1.2.xsd https\://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd=org/springframework/data/mongodb/config/spring-mongo-1.2.xsd

1
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientNamespaceTests.java

@ -140,5 +140,4 @@ public class MongoClientNamespaceTests {
assertThat(settings.getConnectionPoolSettings().getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)).isEqualTo(30); assertThat(settings.getConnectionPoolSettings().getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)).isEqualTo(30);
assertThat(settings.getConnectionPoolSettings().getMaxWaitTime(TimeUnit.MILLISECONDS)).isEqualTo(15); assertThat(settings.getConnectionPoolSettings().getMaxWaitTime(TimeUnit.MILLISECONDS)).isEqualTo(15);
} }
} }

18
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceTests.java

@ -204,8 +204,7 @@ public class MongoNamespaceTests {
} }
@Test @Test
@SuppressWarnings("deprecation") public void testMongoSingletonWithPropertyPlaceHolders() {
public void testMongoSingletonWithPropertyPlaceHolders() throws Exception {
assertThat(ctx.containsBean("mongoClient")).isTrue(); assertThat(ctx.containsBean("mongoClient")).isTrue();
MongoClientFactoryBean mfb = (MongoClientFactoryBean) ctx.getBean("&mongoClient"); MongoClientFactoryBean mfb = (MongoClientFactoryBean) ctx.getBean("&mongoClient");
@ -215,20 +214,5 @@ public class MongoNamespaceTests {
assertThat(host).isEqualTo("127.0.0.1"); assertThat(host).isEqualTo("127.0.0.1");
assertThat(port).isEqualTo(new Integer(27017)); assertThat(port).isEqualTo(new Integer(27017));
// MongoClient mongo = mfb.getObject();
// MongoClientSettings mongoOpts = mongo.getClusterDescription()..getMongoClientSettings();
//
// assertThat(mongoOpts.getConnectionsPerHost()).isEqualTo(8);
// assertThat(mongoOpts.getConnectTimeout()).isEqualTo(1000);
// assertThat(mongoOpts.getMaxWaitTime()).isEqualTo(1500);
//
// assertThat(mongoOpts.getSocketTimeout()).isEqualTo(1500);
// assertThat(mongoOpts.getThreadsAllowedToBlockForConnectionMultiplier()).isEqualTo(4);
// TODO: check the damned defaults
// assertEquals("w", mongoOpts.getWriteConcern().getW());
// assertEquals(0, mongoOpts.getWriteConcern().getWtimeout());
// assertEquals(true, mongoOpts.getWriteConcern().fsync());
} }
} }

24
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoClientFactoryBeanUnitTests.java

@ -1,19 +1,3 @@
/*
* Copyright 2019. 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.
*/
/* /*
* Copyright 2019 the original author or authors. * Copyright 2019 the original author or authors.
* *
@ -35,13 +19,15 @@ import static org.assertj.core.api.Assertions.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.mongodb.ServerAddress;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import com.mongodb.ConnectionString; import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings;
import com.mongodb.ServerAddress;
/** /**
* Unit tests for {@link MongoClientFactoryBean}.
*
* @author Christoph Strobl * @author Christoph Strobl
*/ */
class MongoClientFactoryBeanUnitTests { class MongoClientFactoryBeanUnitTests {
@ -95,12 +81,12 @@ class MongoClientFactoryBeanUnitTests {
} }
@Test // DATAMONGO-2427 @Test // DATAMONGO-2427
void hostAndPortPlusConnectionStringError() throws Exception { void hostAndPortPlusConnectionStringError() {
MongoClientFactoryBean factoryBean = new MongoClientFactoryBean(); MongoClientFactoryBean factoryBean = new MongoClientFactoryBean();
factoryBean.setConnectionString(CONNECTION_STRING); factoryBean.setConnectionString(CONNECTION_STRING);
factoryBean.setHost("localhost"); factoryBean.setHost("localhost");
factoryBean.setPort(27017); factoryBean.setPort(27017);
assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> factoryBean.createInstance()); assertThatExceptionOfType(IllegalStateException.class).isThrownBy(factoryBean::createInstance);
} }
} }

2
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoClientSettingsFactoryBeanUnitTests.java

@ -28,7 +28,7 @@ import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference; import com.mongodb.ReadPreference;
/** /**
* Integration tests for {@link MongoClientSettingsFactoryBean}. * Unit tests for {@link MongoClientSettingsFactoryBean}.
* *
* @author Christoph Strobl * @author Christoph Strobl
*/ */

2
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java

@ -79,6 +79,7 @@ public class QueryCursorPreparerUnitTests {
verify(cursor).hint(new Document("age", 1)); verify(cursor).hint(new Document("age", 1));
} }
// TODO
// @Test // DATAMONGO-957 // @Test // DATAMONGO-957
// public void doesNotApplyMetaWhenEmpty() { // public void doesNotApplyMetaWhenEmpty() {
// //
@ -117,6 +118,7 @@ public class QueryCursorPreparerUnitTests {
verify(cursor).comment("spring data"); verify(cursor).comment("spring data");
} }
// TODO
// @Test // DATAMONGO-957 // @Test // DATAMONGO-957
// public void appliesSnapshotCorrectly() { // public void appliesSnapshotCorrectly() {
// //

8
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SimpleMongoClientDatabaseFactoryUnitTests.java

@ -17,7 +17,6 @@ package org.springframework.data.mongodb.core;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import static org.springframework.test.util.ReflectionTestUtils.*;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
@ -26,6 +25,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.aop.framework.AopProxyUtils; import org.springframework.aop.framework.AopProxyUtils;
import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
@ -61,7 +61,6 @@ public class SimpleMongoClientDatabaseFactoryUnitTests {
} }
@Test // DATADOC-254 @Test // DATADOC-254
@SuppressWarnings("deprecation")
public void allowsDatabaseNames() { public void allowsDatabaseNames() {
new SimpleMongoClientDatabaseFactory(mongo, "foo-bar"); new SimpleMongoClientDatabaseFactory(mongo, "foo-bar");
new SimpleMongoClientDatabaseFactory(mongo, "foo_bar"); new SimpleMongoClientDatabaseFactory(mongo, "foo_bar");
@ -69,14 +68,13 @@ public class SimpleMongoClientDatabaseFactoryUnitTests {
} }
@Test // DATADOC-295 @Test // DATADOC-295
@SuppressWarnings("deprecation")
public void mongoUriConstructor() { public void mongoUriConstructor() {
ConnectionString mongoURI = new ConnectionString( ConnectionString mongoURI = new ConnectionString(
"mongodb://myUsername:myPassword@localhost/myDatabase.myCollection"); "mongodb://myUsername:myPassword@localhost/myDatabase.myCollection");
MongoDatabaseFactory mongoDbFactory = new SimpleMongoClientDatabaseFactory(mongoURI); MongoDatabaseFactory mongoDbFactory = new SimpleMongoClientDatabaseFactory(mongoURI);
assertThat(getField(mongoDbFactory, "databaseName").toString()).isEqualTo("myDatabase"); assertThat(mongoDbFactory).hasFieldOrPropertyWithValue("databaseName", "myDatabase");
} }
@Test // DATAMONGO-1158 @Test // DATAMONGO-1158
@ -86,7 +84,7 @@ public class SimpleMongoClientDatabaseFactoryUnitTests {
"mongodb://myUserName:myPassWord@127.0.0.1:27017/myDataBase.myCollection"); "mongodb://myUserName:myPassWord@127.0.0.1:27017/myDataBase.myCollection");
SimpleMongoClientDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(uri); SimpleMongoClientDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(uri);
assertThat(getField(factory, "databaseName").toString()).isEqualTo("myDataBase"); assertThat(factory).hasFieldOrPropertyWithValue("databaseName", "myDataBase");
} }
@Test // DATAMONGO-1880 @Test // DATAMONGO-1880

1
src/main/asciidoc/new-features.adoc

@ -4,6 +4,7 @@
[[new-features.3.0]] [[new-features.3.0]]
== What's New in Spring Data MongoDB 3.0 == What's New in Spring Data MongoDB 3.0
* Upgrade to MongoDB Driver 4.0. See <<upgrading.2-3>> for further details.
* Support for <<mongo-template.aggregation-update,aggregation pipelines in update operations>>. * Support for <<mongo-template.aggregation-update,aggregation pipelines in update operations>>.
* Removal of `_id` flattening for composite Id's when using `MongoTemplate` aggregations. * Removal of `_id` flattening for composite Id's when using `MongoTemplate` aggregations.
* Apply pagination when using GridFS `find(Query)`. * Apply pagination when using GridFS `find(Query)`.

11
src/main/asciidoc/preface.adoc

@ -39,20 +39,23 @@ The starting point for learning about MongoDB is https://www.mongodb.org/[www.mo
[[requirements]] [[requirements]]
== Requirements == Requirements
The Spring Data MongoDB 2.x binaries require JDK level 8.0 and above and https://spring.io/docs[Spring Framework] {springVersion} and above. The Spring Data MongoDB 3.x binaries require JDK level 8.0 and above and https://spring.io/docs[Spring Framework] {springVersion} and above.
In terms of document stores, you need at least version 2.6 of https://www.mongodb.org/[MongoDB]. In terms of document stores, you need at least version 2.6 of https://www.mongodb.org/[MongoDB].
[[get-started:help]] [[get-started:help]]
== Additional Help Resources == Additional Help Resources
Learning a new framework is not always straightforward. In this section, we try to provide what we think is an easy-to-follow guide for starting with the Spring Data MongoDB module. However, if you encounter issues or you need advice, feel free to use one of the following links: Learning a new framework is not always straightforward.
In this section, we try to provide what we think is an easy-to-follow guide for starting with the Spring Data MongoDB module.
However, if you encounter issues or you need advice, feel free to use one of the following links:
[[get-started:help:community]] [[get-started:help:community]]
Community Forum :: Spring Data on https://stackoverflow.com/questions/tagged/spring-data[Stack Overflow] is a tag for all Spring Data (not just Document) users to share information and help each other. Note that registration is needed only for posting. Community Forum :: Spring Data on https://stackoverflow.com/questions/tagged/spring-data[Stack Overflow] is a tag for all Spring Data (not just Document) users to share information and help each other.
Note that registration is needed only for posting.
[[get-started:help:professional]] [[get-started:help:professional]]
Professional Support :: Professional, from-the-source support, with guaranteed response time, is available from https://pivotal.io/[Pivotal Sofware, Inc.], the company behind Spring Data and Spring. Professional Support :: Professional, from-the-source support, with guaranteed response time, is available from https://pivotal.io/[Pivotal Software, Inc.], the company behind Spring Data and Spring.
[[get-started:up-to-date]] [[get-started:up-to-date]]
== Following Development == Following Development

6
src/main/asciidoc/reference/client-session-transactions.adoc

@ -185,10 +185,10 @@ The `MongoTransactionManager` binds a `ClientSession` to the thread. `MongoTempl
[source,java] [source,java]
---- ----
@Configuration @Configuration
static class Config extends AbstractMongoConfiguration { static class Config extends AbstractMongoClientConfiguration {
@Bean @Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) { <1> MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { <1>
return new MongoTransactionManager(dbFactory); return new MongoTransactionManager(dbFactory);
} }
@ -199,7 +199,7 @@ static class Config extends AbstractMongoConfiguration {
public class StateService { public class StateService {
@Transactional @Transactional
void someBusinessFunction(Step step) { <2> void someBusinessFunction(Step step) { <2>
template.insert(step); template.insert(step);

8
src/main/asciidoc/reference/mapping.adoc

@ -278,7 +278,6 @@ public class GeoSpatialAppConfig extends AbstractMongoClientConfiguration {
// the following are optional // the following are optional
@Bean @Bean
@Override @Override
public CustomConversions customConversions() throws Exception { public CustomConversions customConversions() throws Exception {
@ -311,10 +310,9 @@ Spring's MongoDB namespace lets you enable mapping functionality in XML, as the
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context-3.0.xsd xsi:schemaLocation="
http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Default bean name is 'mongo' --> <!-- Default bean name is 'mongo' -->
@ -769,7 +767,7 @@ To selectively handle the conversion yourself, register one or more one or more
NOTE: Spring 3.0 introduced a core.convert package that provides a general type conversion system. This is described in detail in the Spring reference documentation section entitled https://docs.spring.io/spring/docs/{springVersion}/spring-framework-reference/core.html#validation["`Spring Type Conversion`"]. NOTE: Spring 3.0 introduced a core.convert package that provides a general type conversion system. This is described in detail in the Spring reference documentation section entitled https://docs.spring.io/spring/docs/{springVersion}/spring-framework-reference/core.html#validation["`Spring Type Conversion`"].
You can use the `customConversions` method in `AbstractMongoConfiguration` to configure converters. The examples <<mapping-configuration, at the beginning of this chapter>> show how to perform the configuration using Java and XML. You can use the `customConversions` method in `AbstractMongoClientConfiguration` to configure converters. The examples <<mapping-configuration, at the beginning of this chapter>> show how to perform the configuration using Java and XML.
The following example of a Spring Converter implementation converts from a `Document` to a `Person` POJO: The following example of a Spring Converter implementation converts from a `Document` to a `Person` POJO:

5
src/main/asciidoc/reference/migrating.adoc

@ -13,8 +13,7 @@ This chapter coverts major changes and outlines migration steps.
** core-jar ** core-jar
** sync-jar ** sync-jar
The change in dependencies allows usage of the reactive support without having to pull the synchronous driver.
This allows to include eg. just the reactive bits without having to pull in all the sync stuff.
NOTE: The new sync driver does no longer support `com.mongodb.DBObject`. Please use `org.bson.Document` instead. NOTE: The new sync driver does no longer support `com.mongodb.DBObject`. Please use `org.bson.Document` instead.
=== Signature Changes === Signature Changes
@ -22,7 +21,7 @@ NOTE: The new sync driver does no longer support `com.mongodb.DBObject`. Please
* `MongoTemplate` no longer supports `com.mongodb.MongoClient` and `com.mongodb.MongoClientOptions`. * `MongoTemplate` no longer supports `com.mongodb.MongoClient` and `com.mongodb.MongoClientOptions`.
Please use `com.mongodb.client.MongoClient` and `com.mongodb.MongoClientSettings` instead. Please use `com.mongodb.client.MongoClient` and `com.mongodb.MongoClientSettings` instead.
In case you're using `AbstractMongoConfiguration` please switch to `AbstractMongoClientInformation`. In case you're using `AbstractMongoConfiguration` please switch to `AbstractMongoClientConfiguration`.
=== Namespace Changes === Namespace Changes

11
src/main/asciidoc/reference/mongo-3.adoc

@ -1,12 +1,10 @@
[[mongo.mongo-3]] [[mongo.mongo-3]]
= MongoDB 3.0 Support = MongoDB 3.0 Support
Spring Data MongoDB requires MongoDB Java driver generations 3 when connecting to a MongoDB 2.6/3.0 server running MMap.v1 or a MongoDB server 3.0 using MMap.v1 or the WiredTiger storage engine. Spring Data MongoDB requires MongoDB Java driver generations 4 when connecting to a MongoDB 2.6/3.0 server running MMap.v1 or a MongoDB server 3.0 using MMap.v1 or the WiredTiger storage engine.
NOTE: See the driver- and database-specific documentation for major differences between those engines. NOTE: See the driver- and database-specific documentation for major differences between those engines.
NOTE: Operations that are no longer valid when using a 3.x MongoDB Java driver have been deprecated within Spring Data and will be removed in a subsequent release.
== Using Spring Data MongoDB with MongoDB 3.0 == Using Spring Data MongoDB with MongoDB 3.0
The rest of this section describes how to use Spring Data MongoDB with MongoDB 3.0. The rest of this section describes how to use Spring Data MongoDB with MongoDB 3.0.
@ -51,7 +49,7 @@ MongoDB Server generation 3 changed the authentication model when connecting to
[source,java] [source,java]
---- ----
@Configuration @Configuration
public class ApplicationContextEventTestsAppConfig extends AbstractMongoConfiguration { public class ApplicationContextEventTestsAppConfig extends AbstractMongoClientConfiguration {
@Override @Override
public String getDatabaseName() { public String getDatabaseName() {
@ -118,11 +116,12 @@ NOTE: The field names used within the query expression are mapped to the domain
[[mongo.mongo-3.misc]] [[mongo.mongo-3.misc]]
=== Miscellaneous Details === Miscellaneous Details
This section covers briefly lists additional things to keep in mind when using the 3.0 driver: This section covers briefly lists additional things to keep in mind when using the 4.0 driver:
* `IndexOperations.resetIndexCache()` is no longer supported. * `IndexOperations.resetIndexCache()` is no longer supported.
* Any `MapReduceOptions.extraOption` is silently ignored. * Any `MapReduceOptions.extraOption` is silently ignored.
* `WriteResult` no longer holds error information but, instead, throws an `Exception`. * `WriteResult` no longer holds error information but, instead, throws an `Exception`.
* `MongoOperations.executeInSession(…)` no longer calls `requestStart` and `requestDone`. * `MongoOperations.executeInSession(…)` no longer calls `requestStart` and `requestDone`.
* Index name generation has become a driver-internal operation. Spring Data MongoDB still uses the 2.x schema to generate names. * Index name generation has become a driver-internal operation.
Spring Data MongoDB still uses the 2.x schema to generate names.
* Some `Exception` messages differ between the generation 2 and 3 servers as well as between the MMap.v1 and WiredTiger storage engines. * Some `Exception` messages differ between the generation 2 and 3 servers as well as between the MMap.v1 and WiredTiger storage engines.

4
src/main/asciidoc/reference/mongo-repositories.adoc

@ -112,7 +112,7 @@ Because our domain repository extends `PagingAndSortingRepository`, it provides
==== ====
[source,java] [source,java]
---- ----
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration @ContextConfiguration
public class PersonRepositoryTests { public class PersonRepositoryTests {
@ -601,7 +601,7 @@ class MongoTemplateProducer {
@ApplicationScoped @ApplicationScoped
public MongoOperations createMongoTemplate() { public MongoOperations createMongoTemplate() {
MongoDbFactory factory = new SimpleMongoClientDbFactory(MongoClients.create(), "database"); MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(MongoClients.create(), "database");
return new MongoTemplate(factory); return new MongoTemplate(factory);
} }
} }

38
src/main/asciidoc/reference/mongodb.adoc

@ -165,7 +165,7 @@ There is a https://github.com/spring-projects/spring-data-examples[GitHub reposi
[[mongodb-connectors]] [[mongodb-connectors]]
== Connecting to MongoDB with Spring == Connecting to MongoDB with Spring
One of the first tasks when using MongoDB and Spring is to create a `com.mongodb.client.MongoClient` or `com.mongodb.client.MongoClient` object using the IoC container. There are two main ways to do this, either by using Java-based bean metadata or by using XML-based bean metadata. Both are discussed in the following sections. One of the first tasks when using MongoDB and Spring is to create a `com.mongodb.client.MongoClient` object using the IoC container. There are two main ways to do this, either by using Java-based bean metadata or by using XML-based bean metadata. Both are discussed in the following sections.
NOTE: For those not familiar with how to configure the Spring container using Java-based bean metadata instead of XML-based metadata, see the high-level introduction in the reference docs https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/new-in-3.0.html#new-java-configuration[here] as well as the detailed documentation https://docs.spring.io/spring/docs/{springVersion}/spring-framework-reference/core.html#beans-java-instantiating-container[here]. NOTE: For those not familiar with how to configure the Spring container using Java-based bean metadata instead of XML-based metadata, see the high-level introduction in the reference docs https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/new-in-3.0.html#new-java-configuration[here] as well as the detailed documentation https://docs.spring.io/spring/docs/{springVersion}/spring-framework-reference/core.html#beans-java-instantiating-container[here].
@ -230,11 +230,9 @@ To use the Mongo namespace elements, you need to reference the Mongo schema, as
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation= xsi:schemaLocation=
"http://www.springframework.org/schema/context "
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"> https://www.springframework.org/schema/beans/spring-beans.xsd">
@ -281,21 +279,21 @@ The following example shows a configuration using replica sets:
==== ====
[[mongo.mongo-db-factory]] [[mongo.mongo-db-factory]]
=== The MongoDbFactory Interface === The MongoDatabaseFactory Interface
While `com.mongodb.client.MongoClient` is the entry point to the MongoDB driver API, connecting to a specific MongoDB database instance requires additional information, such as the database name and an optional username and password. With that information, you can obtain a `com.mongodb.client.MongoDatabase` object and access all the functionality of a specific MongoDB database instance. Spring provides the `org.springframework.data.mongodb.core.MongoDbFactory` interface, shown in the following listing, to bootstrap connectivity to the database: While `com.mongodb.client.MongoClient` is the entry point to the MongoDB driver API, connecting to a specific MongoDB database instance requires additional information, such as the database name and an optional username and password. With that information, you can obtain a `com.mongodb.client.MongoDatabase` object and access all the functionality of a specific MongoDB database instance. Spring provides the `org.springframework.data.mongodb.core.MongoDatabaseFactory` interface, shown in the following listing, to bootstrap connectivity to the database:
[source,java] [source,java]
---- ----
public interface MongoDbFactory { public interface MongoDatabaseFactory {
MongoDatabase getDb() throws DataAccessException; MongoDatabase getDatabase() throws DataAccessException;
MongoDatabase getDb(String dbName) throws DataAccessException; MongoDatabase getDatabase(String dbName) throws DataAccessException;
} }
---- ----
The following sections show how you can use the container with either Java-based or XML-based metadata to configure an instance of the `MongoDbFactory` interface. In turn, you can use the `MongoDbFactory` instance to configure `MongoTemplate`. The following sections show how you can use the container with either Java-based or XML-based metadata to configure an instance of the `MongoDatabaseFactory` interface. In turn, you can use the `MongoDatabaseFactory` instance to configure `MongoTemplate`.
Instead of using the IoC container to create an instance of MongoTemplate, you can use them in standard Java code, as follows: Instead of using the IoC container to create an instance of MongoTemplate, you can use them in standard Java code, as follows:
@ -307,7 +305,7 @@ public class MongoApp {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
MongoOperations mongoOps = new MongoTemplate(new SimpleMongoClientDbFactory(MongoClients.create(), "database")); MongoOperations mongoOps = new MongoTemplate(new SimpleMongoClientDatabaseFactory(MongoClients.create(), "database"));
mongoOps.insert(new Person("Joe", 34)); mongoOps.insert(new Person("Joe", 34));
@ -323,17 +321,17 @@ The code in bold highlights the use of `SimpleMongoClientDbFactory` and is the o
NOTE: Use `SimpleMongoClientDbFactory` when choosing `com.mongodb.client.MongoClient` as the entrypoint of choice. NOTE: Use `SimpleMongoClientDbFactory` when choosing `com.mongodb.client.MongoClient` as the entrypoint of choice.
[[mongo.mongo-db-factory-java]] [[mongo.mongo-db-factory-java]]
=== Registering a `MongoDbFactory` Instance by Using Java-based Metadata === Registering a `MongoDatabaseFactory` Instance by Using Java-based Metadata
To register a `MongoDbFactory` instance with the container, you write code much like what was highlighted in the previous code listing. The following listing shows a simple example: To register a `MongoDatabaseFactory` instance with the container, you write code much like what was highlighted in the previous code listing. The following listing shows a simple example:
[source,java] [source,java]
---- ----
@Configuration @Configuration
public class MongoConfiguration { public class MongoConfiguration {
public @Bean MongoDbFactory mongoDbFactory() { public @Bean MongoDatabaseFactory mongoDatabaseFactory() {
return new SimpleMongoClientDbFactory(MongoClients.create(), "database"); return new SimpleMongoClientDatabaseFactory(MongoClients.create(), "database");
} }
} }
---- ----
@ -391,7 +389,7 @@ public class MongoClientConfiguration extends AbstractMongoClientConfiguration {
---- ----
[[mongo.mongo-db-factory-xml]] [[mongo.mongo-db-factory-xml]]
=== Registering a `MongoDbFactory` Instance by Using XML-based Metadata === Registering a `MongoDatabaseFactory` Instance by Using XML-based Metadata
The `mongo` namespace provides a convenient way to create a `SimpleMongoClientDbFactory`, as compared to using the `<beans/>` namespace, as shown in the following example: The `mongo` namespace provides a convenient way to create a `SimpleMongoClientDbFactory`, as compared to using the `<beans/>` namespace, as shown in the following example:
@ -470,12 +468,12 @@ public class AppConfig {
There are several overloaded constructors of `MongoTemplate`: There are several overloaded constructors of `MongoTemplate`:
* `MongoTemplate(MongoClient mongo, String databaseName)`: Takes the `MongoClient` object and the default database name to operate against. * `MongoTemplate(MongoClient mongo, String databaseName)`: Takes the `MongoClient` object and the default database name to operate against.
* `MongoTemplate(MongoDbFactory mongoDbFactory)`: Takes a MongoDbFactory object that encapsulated the `MongoClient` object, database name, and username and password. * `MongoTemplate(MongoDatabaseFactory mongoDbFactory)`: Takes a MongoDbFactory object that encapsulated the `MongoClient` object, database name, and username and password.
* `MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter)`: Adds a `MongoConverter` to use for mapping. * `MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter)`: Adds a `MongoConverter` to use for mapping.
You can also configure a MongoTemplate by using Spring's XML <beans/> schema, as the following example shows: You can also configure a MongoTemplate by using Spring's XML <beans/> schema, as the following example shows:
[source,java] [source,xml]
---- ----
<mongo:mongo-client host="localhost" port="27017"/> <mongo:mongo-client host="localhost" port="27017"/>
@ -3270,7 +3268,7 @@ boolean hasIndex = template.execute("geolocation", new CollectionCallbackBoolean
[[gridfs]] [[gridfs]]
== GridFS Support == GridFS Support
MongoDB supports storing binary files inside its filesystem, GridFS. Spring Data MongoDB provides a `GridFsOperations` interface as well as the corresponding implementation, `GridFsTemplate`, to let you interact with the filesystem. You can set up a `GridFsTemplate` instance by handing it a `MongoDbFactory` as well as a `MongoConverter`, as the following example shows: MongoDB supports storing binary files inside its filesystem, GridFS. Spring Data MongoDB provides a `GridFsOperations` interface as well as the corresponding implementation, `GridFsTemplate`, to let you interact with the filesystem. You can set up a `GridFsTemplate` instance by handing it a `MongoDatabaseFactory` as well as a `MongoConverter`, as the following example shows:
.JavaConfig setup for a GridFsTemplate .JavaConfig setup for a GridFsTemplate
==== ====

2
src/main/asciidoc/upgrading.adoc

@ -1,4 +1,4 @@
[[upgrading]] [[upgrading.2-3]]
= Upgrading from 2.x to 3.x = Upgrading from 2.x to 3.x
Spring Data MongoDB 3.x requires the MongoDB Java Driver 4.x. + Spring Data MongoDB 3.x requires the MongoDB Java Driver 4.x. +

Loading…
Cancel
Save