Add username/password and MongoClientOptions to Mongo config
The username/password option stil lonly works for a single host (to connect to a cluster I suspect you need to set the URI). Also added a MongoClientOptions (if a bean of that type exists it will be used to populate the options that aren't in the URI). Fixed gh-536
This commit is contained in:
parent
6cf946ea3f
commit
6ac85c1759
|
@ -29,6 +29,7 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import com.mongodb.Mongo;
|
||||
import com.mongodb.MongoClientOptions;
|
||||
|
||||
/**
|
||||
* {@link EnableAutoConfiguration Auto-configuration} for Mongo.
|
||||
|
@ -45,6 +46,9 @@ public class MongoAutoConfiguration {
|
|||
@Autowired
|
||||
private MongoProperties properties;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MongoClientOptions options;
|
||||
|
||||
private Mongo mongo;
|
||||
|
||||
@PreDestroy
|
||||
|
@ -57,7 +61,7 @@ public class MongoAutoConfiguration {
|
|||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public Mongo mongo() throws UnknownHostException {
|
||||
this.mongo = this.properties.createMongoClient();
|
||||
this.mongo = this.properties.createMongoClient(this.options);
|
||||
return this.mongo;
|
||||
}
|
||||
|
||||
|
|
|
@ -52,6 +52,13 @@ public class MongoDataAutoConfiguration {
|
|||
@Autowired
|
||||
private MongoProperties properties;
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public MongoDbFactory mongoDbFactory(Mongo mongo) throws Exception {
|
||||
String db = this.properties.getMongoClientDatabase();
|
||||
return new SimpleMongoDbFactory(mongo, db);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory)
|
||||
|
@ -61,18 +68,11 @@ public class MongoDataAutoConfiguration {
|
|||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public MongoDbFactory mongoDbFactory(Mongo mongo) throws Exception {
|
||||
public GridFsTemplate gridFsTemplate(Mongo mongo, MongoTemplate mongoTemplate) {
|
||||
String db = StringUtils.hasText(this.properties.getGridFsDatabase()) ? this.properties
|
||||
.getGridFsDatabase() : this.properties.getMongoClientDatabase();
|
||||
|
||||
return new SimpleMongoDbFactory(mongo, db);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory,
|
||||
MongoTemplate mongoTemplate) {
|
||||
return new GridFsTemplate(mongoDbFactory, mongoTemplate.getConverter());
|
||||
return new GridFsTemplate(new SimpleMongoDbFactory(mongo, db),
|
||||
mongoTemplate.getConverter());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,12 +17,18 @@
|
|||
package org.springframework.boot.autoconfigure.mongo;
|
||||
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
import com.mongodb.DBPort;
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.MongoClientOptions;
|
||||
import com.mongodb.MongoClientOptions.Builder;
|
||||
import com.mongodb.MongoClientURI;
|
||||
import com.mongodb.MongoCredential;
|
||||
import com.mongodb.ServerAddress;
|
||||
|
||||
/**
|
||||
* Configuration properties for Mongo.
|
||||
|
@ -44,6 +50,10 @@ public class MongoProperties {
|
|||
|
||||
private String gridFsDatabase;
|
||||
|
||||
private String username;
|
||||
|
||||
private char[] password;
|
||||
|
||||
public String getHost() {
|
||||
return this.host;
|
||||
}
|
||||
|
@ -60,6 +70,31 @@ public class MongoProperties {
|
|||
this.database = database;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return this.username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public char[] getPassword() {
|
||||
return this.password;
|
||||
}
|
||||
|
||||
public void setPassword(char[] password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public void clearPassword() {
|
||||
if (this.password == null) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < this.password.length; i++) {
|
||||
this.password[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public String getUri() {
|
||||
return this.uri;
|
||||
}
|
||||
|
@ -91,11 +126,51 @@ public class MongoProperties {
|
|||
return new MongoClientURI(this.uri).getDatabase();
|
||||
}
|
||||
|
||||
public MongoClient createMongoClient() throws UnknownHostException {
|
||||
if (this.host != null) {
|
||||
return new MongoClient(this.host, this.port);
|
||||
public MongoClient createMongoClient(MongoClientOptions options)
|
||||
throws UnknownHostException {
|
||||
try {
|
||||
if (this.host != null) {
|
||||
if (options == null) {
|
||||
options = MongoClientOptions.builder().build();
|
||||
}
|
||||
List<MongoCredential> credentials = null;
|
||||
if (this.password != null && this.username != null) {
|
||||
credentials = Arrays.asList(MongoCredential.createMongoCRCredential(
|
||||
this.username, getMongoClientDatabase(), this.password));
|
||||
}
|
||||
return new MongoClient(Arrays.asList(new ServerAddress(this.host,
|
||||
this.port)), credentials, options);
|
||||
}
|
||||
// The options and credentials are in the URI
|
||||
return new MongoClient(new MongoClientURI(this.uri, builder(options)));
|
||||
}
|
||||
return new MongoClient(new MongoClientURI(this.uri));
|
||||
finally {
|
||||
clearPassword();
|
||||
}
|
||||
}
|
||||
|
||||
private Builder builder(MongoClientOptions options) {
|
||||
Builder builder = MongoClientOptions.builder();
|
||||
if (options != null) {
|
||||
builder.alwaysUseMBeans(options.isAlwaysUseMBeans());
|
||||
builder.autoConnectRetry(options.isAutoConnectRetry());
|
||||
builder.connectionsPerHost(options.getConnectionsPerHost());
|
||||
builder.connectTimeout(options.getConnectTimeout());
|
||||
builder.cursorFinalizerEnabled(options.isCursorFinalizerEnabled());
|
||||
builder.dbDecoderFactory(options.getDbDecoderFactory());
|
||||
builder.dbEncoderFactory(options.getDbEncoderFactory());
|
||||
builder.description(options.getDescription());
|
||||
builder.maxAutoConnectRetryTime(options.getMaxAutoConnectRetryTime());
|
||||
builder.maxWaitTime(options.getMaxWaitTime());
|
||||
builder.readPreference(options.getReadPreference());
|
||||
builder.socketFactory(options.getSocketFactory());
|
||||
builder.socketKeepAlive(options.isSocketKeepAlive());
|
||||
builder.socketTimeout(options.getSocketTimeout());
|
||||
builder.threadsAllowedToBlockForConnectionMultiplier(options
|
||||
.getThreadsAllowedToBlockForConnectionMultiplier());
|
||||
builder.writeConcern(options.getWriteConcern());
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,8 +19,13 @@ package org.springframework.boot.autoconfigure.mongo;
|
|||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import com.mongodb.Mongo;
|
||||
import com.mongodb.MongoClientOptions;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
|
@ -41,11 +46,44 @@ public class MongoAutoConfigurationTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void templateExists() {
|
||||
public void clientExists() {
|
||||
this.context = new AnnotationConfigApplicationContext(
|
||||
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class,
|
||||
MongoDataAutoConfiguration.class);
|
||||
assertEquals(1, this.context.getBeanNamesForType(MongoTemplate.class).length);
|
||||
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class);
|
||||
assertEquals(1, this.context.getBeanNamesForType(Mongo.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optionsAdded() {
|
||||
this.context = new AnnotationConfigApplicationContext();
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
"spring.data.mongodb.host:localhost");
|
||||
this.context.register(OptionsConfig.class,
|
||||
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
assertEquals(300, this.context.getBean(Mongo.class).getMongoOptions()
|
||||
.getSocketTimeout());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optionsAddedButNoHost() {
|
||||
this.context = new AnnotationConfigApplicationContext();
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
"spring.data.mongodb.uri:mongodb://localhost/test");
|
||||
this.context.register(OptionsConfig.class,
|
||||
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
assertEquals(300, this.context.getBean(Mongo.class).getMongoOptions()
|
||||
.getSocketTimeout());
|
||||
}
|
||||
|
||||
@Configuration
|
||||
protected static class OptionsConfig {
|
||||
|
||||
@Bean
|
||||
public MongoClientOptions mongoOptions() {
|
||||
return MongoClientOptions.builder().socketTimeout(300).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,7 +19,9 @@ package org.springframework.boot.autoconfigure.mongo;
|
|||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
@ -45,6 +47,18 @@ public class MongoDataAutoConfigurationTests {
|
|||
this.context = new AnnotationConfigApplicationContext(
|
||||
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class,
|
||||
MongoDataAutoConfiguration.class);
|
||||
assertEquals(1, this.context.getBeanNamesForType(MongoTemplate.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gridFsTemplateExists() {
|
||||
this.context = new AnnotationConfigApplicationContext();
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
"spring.data.mongodb.gridFsDatabase:grid");
|
||||
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
||||
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
assertEquals(1, this.context.getBeanNamesForType(GridFsTemplate.class).length);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -74,6 +74,13 @@ public class RelaxedDataBinderTests {
|
|||
assertEquals("bar", target.getFoo());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBindChars() throws Exception {
|
||||
VanillaTarget target = new VanillaTarget();
|
||||
bind(target, "bar: foo");
|
||||
assertEquals("foo", new String(target.getBar()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBindStringWithPrefix() throws Exception {
|
||||
VanillaTarget target = new VanillaTarget();
|
||||
|
@ -656,12 +663,22 @@ public class RelaxedDataBinderTests {
|
|||
|
||||
private String foo;
|
||||
|
||||
private char[] bar;
|
||||
|
||||
private int value;
|
||||
|
||||
private String foo_bar;
|
||||
|
||||
private String fooBaz;
|
||||
|
||||
public char[] getBar() {
|
||||
return this.bar;
|
||||
}
|
||||
|
||||
public void setBar(char[] bar) {
|
||||
this.bar = bar;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return this.value;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue