diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml
index 392b03e08a6..b1211438cbc 100644
--- a/spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-autoconfigure/pom.xml
@@ -174,6 +174,11 @@
hsqldb
test
+
+ mysql
+ mysql-connector-java
+ test
+
org.springframework
spring-test
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/AbstractDataSourceConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/AbstractDataSourceConfiguration.java
index 62bf5cb4b55..d77b3274d39 100644
--- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/AbstractDataSourceConfiguration.java
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/AbstractDataSourceConfiguration.java
@@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.jdbc;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.util.StringUtils;
@@ -29,15 +30,16 @@ import org.springframework.util.StringUtils;
*/
@ConfigurationProperties(name = DataSourceAutoConfiguration.CONFIGURATION_PREFIX)
@EnableConfigurationProperties
-public abstract class AbstractDataSourceConfiguration implements BeanClassLoaderAware {
+public abstract class AbstractDataSourceConfiguration implements BeanClassLoaderAware,
+ InitializingBean {
private String driverClassName;
private String url;
- private String username = "sa";
+ private String username;
- private String password = "";
+ private String password;
private int maxActive = 100;
@@ -53,41 +55,67 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader
private ClassLoader classLoader;
+ private EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection.NONE;
+
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ this.embeddedDatabaseConnection = EmbeddedDatabaseConnection
+ .get(this.classLoader);
+ }
+
protected String getDriverClassName() {
if (StringUtils.hasText(this.driverClassName)) {
return this.driverClassName;
}
- EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection
- .get(this.classLoader);
- this.driverClassName = embeddedDatabaseConnection.getDriverClassName();
- if (!StringUtils.hasText(this.driverClassName)) {
+ String driverClassName = this.embeddedDatabaseConnection.getDriverClassName();
+ if (!StringUtils.hasText(driverClassName)) {
throw new BeanCreationException(
"Cannot determine embedded database driver class for database type "
- + embeddedDatabaseConnection + ". If you want an embedded "
- + "database please put a supoprted one on the classpath.");
+ + this.embeddedDatabaseConnection
+ + ". If you want an embedded "
+ + "database please put a supported one on the classpath.");
}
- return this.driverClassName;
+ return driverClassName;
}
protected String getUrl() {
if (StringUtils.hasText(this.url)) {
return this.url;
}
- EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection
- .get(this.classLoader);
- this.url = embeddedDatabaseConnection.getUrl();
- if (!StringUtils.hasText(this.url)) {
+ String url = this.embeddedDatabaseConnection.getUrl();
+ if (!StringUtils.hasText(url)) {
throw new BeanCreationException(
"Cannot determine embedded database url for database type "
- + embeddedDatabaseConnection + ". If you want an embedded "
+ + this.embeddedDatabaseConnection
+ + ". If you want an embedded "
+ "database please put a supported on on the classpath.");
}
- return this.url;
+ return url;
+ }
+
+ protected String getUsername() {
+ if (StringUtils.hasText(this.username)) {
+ return this.username;
+ }
+ if (EmbeddedDatabaseConnection.isEmbedded(this.driverClassName)) {
+ return "sa";
+ }
+ return null;
+ }
+
+ protected String getPassword() {
+ if (StringUtils.hasText(this.password)) {
+ return this.password;
+ }
+ if (EmbeddedDatabaseConnection.isEmbedded(this.driverClassName)) {
+ return "";
+ }
+ return null;
}
public void setDriverClassName(String driverClassName) {
@@ -130,14 +158,6 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader
this.testOnReturn = testOnReturn;
}
- protected String getUsername() {
- return this.username;
- }
-
- protected String getPassword() {
- return this.password;
- }
-
protected int getMaxActive() {
return this.maxActive;
}
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/CommonsDataSourceConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/CommonsDataSourceConfiguration.java
index 1c1879be506..707f1025fe9 100644
--- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/CommonsDataSourceConfiguration.java
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/CommonsDataSourceConfiguration.java
@@ -49,8 +49,12 @@ public class CommonsDataSourceConfiguration extends AbstractDataSourceConfigurat
this.pool = new BasicDataSource();
this.pool.setDriverClassName(getDriverClassName());
this.pool.setUrl(getUrl());
- this.pool.setUsername(getUsername());
- this.pool.setPassword(getPassword());
+ if (getUsername() != null) {
+ this.pool.setUsername(getUsername());
+ }
+ if (getPassword() != null) {
+ this.pool.setPassword(getPassword());
+ }
this.pool.setMaxActive(getMaxActive());
this.pool.setMaxIdle(getMaxIdle());
this.pool.setMinIdle(getMinIdle());
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDatabaseConnection.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDatabaseConnection.java
index 3e961db5fb9..8cae153e9d5 100644
--- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDatabaseConnection.java
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDatabaseConnection.java
@@ -88,6 +88,20 @@ public enum EmbeddedDatabaseConnection {
*/
static EmbeddedDatabaseConnection override;
+ /**
+ * Convenience method to determine if a given driver class name represents an embedded
+ * database type.
+ *
+ * @param driverClass the driver class
+ * @return true if the driver class is one of the embedded types
+ */
+ public static boolean isEmbedded(String driverClass) {
+ return driverClass != null
+ && (driverClass.equals(HSQL.driverClass)
+ || driverClass.equals(H2.driverClass) || driverClass
+ .equals(DERBY.driverClass));
+ }
+
/**
* Returns the most suitable {@link EmbeddedDatabaseConnection} for the given class
* loader.
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/TomcatDataSourceConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/TomcatDataSourceConfiguration.java
index 464499407a6..a8f44ff984f 100644
--- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/TomcatDataSourceConfiguration.java
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/TomcatDataSourceConfiguration.java
@@ -39,8 +39,12 @@ public class TomcatDataSourceConfiguration extends AbstractDataSourceConfigurati
this.pool = new org.apache.tomcat.jdbc.pool.DataSource();
this.pool.setDriverClassName(getDriverClassName());
this.pool.setUrl(getUrl());
- this.pool.setUsername(getUsername());
- this.pool.setPassword(getPassword());
+ if (getUsername() != null) {
+ this.pool.setUsername(getUsername());
+ }
+ if (getPassword() != null) {
+ this.pool.setPassword(getPassword());
+ }
this.pool.setMaxActive(getMaxActive());
this.pool.setMaxIdle(getMaxIdle());
this.pool.setMinIdle(getMinIdle());
diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java
index 2a14c2eca4f..a725f5b711e 100644
--- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java
+++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java
@@ -23,6 +23,7 @@ import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;
+import org.springframework.boot.TestUtils;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
@@ -35,6 +36,7 @@ import org.springframework.util.ClassUtils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
@@ -54,6 +56,36 @@ public class DataSourceAutoConfigurationTests {
assertNotNull(this.context.getBean(DataSource.class));
}
+ @Test
+ public void testEmbeddedTypeDefaultsUsername() throws Exception {
+ TestUtils.addEnviroment(this.context,
+ "spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
+ "spring.datasource.url:jdbc:hsqldb:mem:testdb");
+ this.context.register(DataSourceAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ this.context.refresh();
+ DataSource bean = this.context.getBean(DataSource.class);
+ assertNotNull(bean);
+ org.apache.tomcat.jdbc.pool.DataSource pool = (org.apache.tomcat.jdbc.pool.DataSource) bean;
+ assertEquals("org.hsqldb.jdbcDriver", pool.getDriverClassName());
+ assertEquals("sa", pool.getUsername());
+ }
+
+ @Test
+ public void testExplicitDriverClassClearsUserName() throws Exception {
+ TestUtils.addEnviroment(this.context,
+ "spring.datasource.driverClassName:com.mysql.jdbc.Driver",
+ "spring.datasource.url:jdbc:mysql://localhost");
+ this.context.register(DataSourceAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ this.context.refresh();
+ DataSource bean = this.context.getBean(DataSource.class);
+ assertNotNull(bean);
+ org.apache.tomcat.jdbc.pool.DataSource pool = (org.apache.tomcat.jdbc.pool.DataSource) bean;
+ assertEquals("com.mysql.jdbc.Driver", pool.getDriverClassName());
+ assertNull(pool.getUsername());
+ }
+
@Test
public void testDefaultDataSourceCanBeOverridden() throws Exception {
this.context.register(TestDataSourceConfiguration.class,
diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml
index 4f1b5e93ad9..031edca02c9 100644
--- a/spring-boot-dependencies/pom.xml
+++ b/spring-boot-dependencies/pom.xml
@@ -28,6 +28,7 @@
1.2.17
1.0.13
1.9.5
+ 5.1.23
1.0.0.M3
3.0.1
1.7.5
@@ -104,6 +105,11 @@
log4j
${log4j.version}
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
nz.net.ultraq.thymeleaf
thymeleaf-layout-dialect