Merge branch '2.7.x'

This commit is contained in:
Andy Wilkinson 2022-03-23 20:16:51 +00:00
commit 5702f9ebc3
3 changed files with 26 additions and 41 deletions

View File

@ -59,8 +59,7 @@ public class MongoProperties {
private Integer port = null; private Integer port = null;
/** /**
* Mongo database URI. Cannot be set with host, port, credentials and replica set * Mongo database URI. Overrides host, port, username, password, and database.
* name.
*/ */
private String uri; private String uri;

View File

@ -25,7 +25,6 @@ import com.mongodb.ServerAddress;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.util.Assert;
/** /**
* A {@link MongoClientSettingsBuilderCustomizer} that applies properties from a * A {@link MongoClientSettingsBuilderCustomizer} that applies properties from a
@ -49,20 +48,12 @@ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClie
@Override @Override
public void customize(MongoClientSettings.Builder settingsBuilder) { public void customize(MongoClientSettings.Builder settingsBuilder) {
validateConfiguration();
applyUuidRepresentation(settingsBuilder); applyUuidRepresentation(settingsBuilder);
applyHostAndPort(settingsBuilder); applyHostAndPort(settingsBuilder);
applyCredentials(settingsBuilder); applyCredentials(settingsBuilder);
applyReplicaSet(settingsBuilder); applyReplicaSet(settingsBuilder);
} }
private void validateConfiguration() {
if (hasCustomAddress() || hasCustomCredentials() || hasReplicaSet()) {
Assert.state(this.properties.getUri() == null,
"Invalid mongo configuration, either uri or host/port/credentials/replicaSet must be specified");
}
}
private void applyUuidRepresentation(MongoClientSettings.Builder settingsBuilder) { private void applyUuidRepresentation(MongoClientSettings.Builder settingsBuilder) {
settingsBuilder.uuidRepresentation(this.properties.getUuidRepresentation()); settingsBuilder.uuidRepresentation(this.properties.getUuidRepresentation());
} }
@ -72,20 +63,23 @@ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClie
settings.applyConnectionString(new ConnectionString("mongodb://localhost:" + getEmbeddedPort())); settings.applyConnectionString(new ConnectionString("mongodb://localhost:" + getEmbeddedPort()));
return; return;
} }
if (this.properties.getUri() != null) {
if (hasCustomAddress()) { settings.applyConnectionString(new ConnectionString(this.properties.getUri()));
return;
}
if (this.properties.getHost() != null || this.properties.getPort() != null) {
String host = getOrDefault(this.properties.getHost(), "localhost"); String host = getOrDefault(this.properties.getHost(), "localhost");
int port = getOrDefault(this.properties.getPort(), MongoProperties.DEFAULT_PORT); int port = getOrDefault(this.properties.getPort(), MongoProperties.DEFAULT_PORT);
ServerAddress serverAddress = new ServerAddress(host, port); ServerAddress serverAddress = new ServerAddress(host, port);
settings.applyToClusterSettings((cluster) -> cluster.hosts(Collections.singletonList(serverAddress))); settings.applyToClusterSettings((cluster) -> cluster.hosts(Collections.singletonList(serverAddress)));
return; return;
} }
settings.applyConnectionString(new ConnectionString(MongoProperties.DEFAULT_URI));
settings.applyConnectionString(new ConnectionString(this.properties.determineUri()));
} }
private void applyCredentials(MongoClientSettings.Builder builder) { private void applyCredentials(MongoClientSettings.Builder builder) {
if (hasCustomCredentials()) { if (this.properties.getUri() == null && this.properties.getUsername() != null
&& this.properties.getPassword() != null) {
String database = (this.properties.getAuthenticationDatabase() != null) String database = (this.properties.getAuthenticationDatabase() != null)
? this.properties.getAuthenticationDatabase() : this.properties.getMongoClientDatabase(); ? this.properties.getAuthenticationDatabase() : this.properties.getMongoClientDatabase();
builder.credential((MongoCredential.createCredential(this.properties.getUsername(), database, builder.credential((MongoCredential.createCredential(this.properties.getUsername(), database,
@ -94,7 +88,7 @@ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClie
} }
private void applyReplicaSet(MongoClientSettings.Builder builder) { private void applyReplicaSet(MongoClientSettings.Builder builder) {
if (hasReplicaSet()) { if (this.properties.getReplicaSetName() != null) {
builder.applyToClusterSettings( builder.applyToClusterSettings(
(cluster) -> cluster.requiredReplicaSetName(this.properties.getReplicaSetName())); (cluster) -> cluster.requiredReplicaSetName(this.properties.getReplicaSetName()));
} }
@ -114,18 +108,6 @@ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClie
return null; return null;
} }
private boolean hasCustomCredentials() {
return this.properties.getUsername() != null && this.properties.getPassword() != null;
}
private boolean hasCustomAddress() {
return this.properties.getHost() != null || this.properties.getPort() != null;
}
private boolean hasReplicaSet() {
return this.properties.getReplicaSetName() != null;
}
@Override @Override
public int getOrder() { public int getOrder() {
return this.order; return this.order;

View File

@ -27,7 +27,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
/** /**
* Tests for {@link MongoPropertiesClientSettingsBuilderCustomizer}. * Tests for {@link MongoPropertiesClientSettingsBuilderCustomizer}.
@ -153,29 +152,34 @@ class MongoPropertiesClientSettingsBuilderCustomizerTests {
} }
@Test @Test
void uriCannotBeSetWithCredentials() { void uriOverridesUsernameAndPassword() {
this.properties.setUri("mongodb://127.0.0.1:1234/mydb"); this.properties.setUri("mongodb://127.0.0.1:1234/mydb");
this.properties.setUsername("user"); this.properties.setUsername("user");
this.properties.setPassword("secret".toCharArray()); this.properties.setPassword("secret".toCharArray());
assertThatIllegalStateException().isThrownBy(this::customizeSettings).withMessageContaining( MongoClientSettings settings = customizeSettings();
"Invalid mongo configuration, either uri or host/port/credentials/replicaSet must be specified"); assertThat(settings.getCredential()).isNull();
} }
@Test @Test
void uriCannotBeSetWithReplicaSetName() { void uriOverridesDatabase() {
this.properties.setUri("mongodb://127.0.0.1:1234/mydb"); this.properties.setUri("mongodb://secret:password@127.0.0.1:1234/mydb");
this.properties.setReplicaSetName("test"); this.properties.setDatabase("test");
assertThatIllegalStateException().isThrownBy(this::customizeSettings).withMessageContaining( MongoClientSettings settings = customizeSettings();
"Invalid mongo configuration, either uri or host/port/credentials/replicaSet must be specified"); List<ServerAddress> allAddresses = getAllAddresses(settings);
assertThat(allAddresses).hasSize(1);
assertServerAddress(allAddresses.get(0), "127.0.0.1", 1234);
assertThat(settings.getCredential().getSource()).isEqualTo("mydb");
} }
@Test @Test
void uriCannotBeSetWithHostPort() { void uriOverridesHostAndPort() {
this.properties.setUri("mongodb://127.0.0.1:1234/mydb"); this.properties.setUri("mongodb://127.0.0.1:1234/mydb");
this.properties.setHost("localhost"); this.properties.setHost("localhost");
this.properties.setPort(4567); this.properties.setPort(4567);
assertThatIllegalStateException().isThrownBy(this::customizeSettings).withMessageContaining( MongoClientSettings settings = customizeSettings();
"Invalid mongo configuration, either uri or host/port/credentials/replicaSet must be specified"); List<ServerAddress> addresses = getAllAddresses(settings);
assertThat(addresses.get(0).getHost()).isEqualTo("127.0.0.1");
assertThat(addresses.get(0).getPort()).isEqualTo(1234);
} }
@Test @Test