Commit 2a3d7611 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge pull request #9341 from mp911de:async-mongo-builder-customizer

* pr/9341:
  Polish "Allow customization of MongoClientSettings.Builder"
  Allow customization of MongoClientSettings.Builder
parents 4a605f62 eaa34874
/*
* 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 clientSettingsBuilder the builder to customize
*/
void customize(Builder clientSettingsBuilder);
}
......@@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.mongo;
import java.util.List;
import javax.annotation.PreDestroy;
import com.mongodb.async.client.MongoClientSettings;
......@@ -49,9 +51,11 @@ public class MongoReactiveAutoConfiguration {
private MongoClient mongo;
public MongoReactiveAutoConfiguration(MongoProperties properties,
ObjectProvider<MongoClientSettings> settings, Environment environment) {
ObjectProvider<MongoClientSettings> settings, Environment environment,
ObjectProvider<List<MongoClientSettingsBuilderCustomizer>> builderCustomizers) {
this.settings = settings.getIfAvailable();
this.factory = new ReactiveMongoClientFactory(properties, environment);
this.factory = new ReactiveMongoClientFactory(properties, environment,
builderCustomizers.getIfAvailable());
}
@PreDestroy
......
......@@ -48,10 +48,14 @@ public class ReactiveMongoClientFactory {
private final Environment environment;
public ReactiveMongoClientFactory(MongoProperties properties,
Environment environment) {
private final List<MongoClientSettingsBuilderCustomizer> builderCustomizers;
public ReactiveMongoClientFactory(MongoProperties properties, Environment environment,
List<MongoClientSettingsBuilderCustomizer> builderCustomizers) {
this.properties = properties;
this.environment = environment;
this.builderCustomizers = (builderCustomizers != null ? builderCustomizers
: Collections.emptyList());
}
/**
......@@ -149,9 +153,16 @@ public class ReactiveMongoClientFactory {
if (connectionString.getApplicationName() != null) {
builder.applicationName(connectionString.getApplicationName());
}
customize(builder);
return builder;
}
private void customize(MongoClientSettings.Builder builder) {
for (MongoClientSettingsBuilderCustomizer customizer : this.builderCustomizers) {
customizer.customize(builder);
}
}
private boolean hasCustomAddress() {
return this.properties.getHost() != null || this.properties.getPort() != null;
}
......
......@@ -106,6 +106,22 @@ public class MongoReactiveAutoConfigurationTests {
.isSameAs(this.context.getBean("myStreamFactoryFactory"));
}
@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
static class OptionsConfig {
......@@ -138,4 +154,15 @@ public class MongoReactiveAutoConfigurationTests {
}
@Configuration
static class SimpleCustomizerConfig {
@Bean
public MongoClientSettingsBuilderCustomizer customizer() {
return clientSettingsBuilder ->
clientSettingsBuilder.applicationName("overridden-name");
}
}
}
......@@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.mongo;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;
import com.mongodb.MongoCredential;
......@@ -32,6 +33,9 @@ import org.springframework.core.env.Environment;
import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* Tests for {@link ReactiveMongoClientFactory}.
......@@ -148,14 +152,24 @@ public class ReactiveMongoClientFactoryTests {
assertServerAddress(allAddresses.get(0), "localhost", 4000);
}
@Test
public void customizerIsInvoked() {
MongoProperties properties = new MongoProperties();
MongoClientSettingsBuilderCustomizer customizer = mock(
MongoClientSettingsBuilderCustomizer.class);
createMongoClient(properties, this.environment, customizer);
verify(customizer).customize(any(MongoClientSettings.Builder.class));
}
private MongoClient createMongoClient(MongoProperties properties) {
return createMongoClient(properties, this.environment);
}
private MongoClient createMongoClient(MongoProperties properties,
Environment environment) {
return new ReactiveMongoClientFactory(properties, environment)
.createMongoClient(null);
Environment environment,
MongoClientSettingsBuilderCustomizer... customizers) {
return new ReactiveMongoClientFactory(properties, environment,
Arrays.asList(customizers)).createMongoClient(null);
}
private List<ServerAddress> extractServerAddresses(MongoClient client) {
......
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