Commit eeb96107 authored by Mark Paluch's avatar Mark Paluch Committed by Stephane Nicoll

Allow customization of MongoClientSettings.Builder

MongoClientSettingsBuilderCustomizer allows customization of the
auto-configured `MongoClientSettings.Builder`.

See gh-9341
parent 4a605f62
/*
* Copyright 2012-2017 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.boot.autoconfigure.mongo;
import com.mongodb.async.client.MongoClientSettings.Builder;
/**
* Callback interface that can be implemented by beans wishing to customize the
* {@link com.mongodb.async.client.MongoClientSettings} via a {@link Builder
* MongoClientSettings.Builder} whilst retaining default auto-configuration.
*
* @author Mark Paluch
* @since 2.0.0
*/
@FunctionalInterface
public interface MongoClientSettingsBuilderCustomizer {
/**
* Customize the {@link Builder}.
* @param settingsBuilder the builder to customize
*/
void customize(Builder settingsBuilder);
}
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.mongo; package org.springframework.boot.autoconfigure.mongo;
import java.util.List;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import com.mongodb.async.client.MongoClientSettings; import com.mongodb.async.client.MongoClientSettings;
...@@ -49,9 +51,11 @@ public class MongoReactiveAutoConfiguration { ...@@ -49,9 +51,11 @@ public class MongoReactiveAutoConfiguration {
private MongoClient mongo; private MongoClient mongo;
public MongoReactiveAutoConfiguration(MongoProperties properties, public MongoReactiveAutoConfiguration(MongoProperties properties,
ObjectProvider<MongoClientSettings> settings, Environment environment) { ObjectProvider<MongoClientSettings> settings, Environment environment,
ObjectProvider<List<MongoClientSettingsBuilderCustomizer>> builderCustomizers) {
this.settings = settings.getIfAvailable(); this.settings = settings.getIfAvailable();
this.factory = new ReactiveMongoClientFactory(properties, environment); this.factory = new ReactiveMongoClientFactory(properties, environment,
builderCustomizers.getIfAvailable());
} }
@PreDestroy @PreDestroy
......
...@@ -48,10 +48,13 @@ public class ReactiveMongoClientFactory { ...@@ -48,10 +48,13 @@ public class ReactiveMongoClientFactory {
private final Environment environment; private final Environment environment;
public ReactiveMongoClientFactory(MongoProperties properties, private final List<MongoClientSettingsBuilderCustomizer> builderCustomizers;
Environment environment) {
public ReactiveMongoClientFactory(MongoProperties properties, Environment environment,
List<MongoClientSettingsBuilderCustomizer> builderCustomizers) {
this.properties = properties; this.properties = properties;
this.environment = environment; this.environment = environment;
this.builderCustomizers = builderCustomizers;
} }
/** /**
...@@ -149,9 +152,18 @@ public class ReactiveMongoClientFactory { ...@@ -149,9 +152,18 @@ public class ReactiveMongoClientFactory {
if (connectionString.getApplicationName() != null) { if (connectionString.getApplicationName() != null) {
builder.applicationName(connectionString.getApplicationName()); builder.applicationName(connectionString.getApplicationName());
} }
customize(builder);
return builder; return builder;
} }
private void customize(MongoClientSettings.Builder builder) {
if (this.builderCustomizers != null) {
for (MongoClientSettingsBuilderCustomizer customizer : this.builderCustomizers) {
customizer.customize(builder);
}
}
}
private boolean hasCustomAddress() { private boolean hasCustomAddress() {
return this.properties.getHost() != null || this.properties.getPort() != null; return this.properties.getHost() != null || this.properties.getPort() != null;
} }
......
...@@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; ...@@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit;
import com.mongodb.ReadPreference; import com.mongodb.ReadPreference;
import com.mongodb.async.client.MongoClientSettings; import com.mongodb.async.client.MongoClientSettings;
import com.mongodb.async.client.MongoClientSettings.Builder;
import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SocketSettings;
import com.mongodb.connection.StreamFactory; import com.mongodb.connection.StreamFactory;
import com.mongodb.connection.StreamFactoryFactory; import com.mongodb.connection.StreamFactoryFactory;
...@@ -37,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -37,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/** /**
* Tests for {@link MongoReactiveAutoConfiguration}. * Tests for {@link MongoReactiveAutoConfiguration}.
...@@ -106,6 +108,37 @@ public class MongoReactiveAutoConfigurationTests { ...@@ -106,6 +108,37 @@ public class MongoReactiveAutoConfigurationTests {
.isSameAs(this.context.getBean("myStreamFactoryFactory")); .isSameAs(this.context.getBean("myStreamFactoryFactory"));
} }
@Test
public void customizerGetsInvoked() {
this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of(
"spring.data.mongodb.uri:mongodb://localhost/test").applyTo(this.context);
this.context.register(PropertyPlaceholderAutoConfiguration.class,
MongoReactiveAutoConfiguration.class, MockCustomizerConfig.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(MongoClient.class).length)
.isEqualTo(1);
MongoClientSettingsBuilderCustomizer customizer = this.context
.getBean(MongoClientSettingsBuilderCustomizer.class);
verify(customizer).customize(any(Builder.class));
}
@Test
public void customizerOverridesAutoConfig() {
this.context = new AnnotationConfigApplicationContext();
TestPropertyValues
.of("spring.data.mongodb.uri:mongodb://localhost/test?appname=auto-config")
.applyTo(this.context);
this.context.register(PropertyPlaceholderAutoConfiguration.class,
MongoReactiveAutoConfiguration.class, SimpleCustomizerConfig.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(MongoClient.class).length)
.isEqualTo(1);
MongoClient client = this.context.getBean(MongoClient.class);
assertThat(client.getSettings().getApplicationName())
.isEqualTo("overridden-name");
}
@Configuration @Configuration
static class OptionsConfig { static class OptionsConfig {
...@@ -138,4 +171,29 @@ public class MongoReactiveAutoConfigurationTests { ...@@ -138,4 +171,29 @@ public class MongoReactiveAutoConfigurationTests {
} }
@Configuration
static class MockCustomizerConfig {
@Bean
public MongoClientSettingsBuilderCustomizer customizer() {
return mock(MongoClientSettingsBuilderCustomizer.class);
}
}
@Configuration
static class SimpleCustomizerConfig {
@Bean
public MongoClientSettingsBuilderCustomizer customizer() {
return new MongoClientSettingsBuilderCustomizer() {
@Override
public void customize(MongoClientSettings.Builder settingsBuilder) {
settingsBuilder.applicationName("overridden-name");
}
};
}
}
} }
...@@ -154,7 +154,7 @@ public class ReactiveMongoClientFactoryTests { ...@@ -154,7 +154,7 @@ public class ReactiveMongoClientFactoryTests {
private MongoClient createMongoClient(MongoProperties properties, private MongoClient createMongoClient(MongoProperties properties,
Environment environment) { Environment environment) {
return new ReactiveMongoClientFactory(properties, environment) return new ReactiveMongoClientFactory(properties, environment, null)
.createMongoClient(null); .createMongoClient(null);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment