diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java index 072ea93810f2..ac38b0da13c4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java @@ -16,26 +16,72 @@ package org.springframework.boot.autoconfigure.jdbc; +import java.util.Objects; + import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.DataSourceBeanCreationException; import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; import org.springframework.boot.diagnostics.FailureAnalysis; +import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; /** * An {@link AbstractFailureAnalyzer} for failures caused by a * {@link DataSourceBeanCreationException}. * * @author Andy Wilkinson + * @author Patryk Kostrzewa */ class DataSourceBeanCreationFailureAnalyzer - extends AbstractFailureAnalyzer { + extends AbstractFailureAnalyzer + implements EnvironmentAware { + + private Environment environment; @Override protected FailureAnalysis analyze(Throwable rootFailure, DataSourceBeanCreationException cause) { - String message = cause.getMessage(); - String description = message.substring(0, message.indexOf('.')).trim(); - String action = message.substring(message.indexOf('.') + 1).trim(); - return new FailureAnalysis(description, action, cause); + return getFailureAnalysis(cause); + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; } + private FailureAnalysis getFailureAnalysis(DataSourceBeanCreationException cause) { + + final EmbeddedDatabaseConnection connection = cause.getConnection(); + final String action; + + if (EmbeddedDatabaseConnection.NONE == connection) { + action = "If you want an embedded database " + + "please put a supported one on the classpath."; + } + else { + action = "If you have database settings to be loaded " + + "from a particular profile you may need to activate it" + + getActiveProfiles(); + } + return new FailureAnalysis(cause.getMessage(), action, cause); + } + + private String getActiveProfiles() { + + final StringBuilder message = new StringBuilder(); + if (Objects.nonNull(this.environment)) { + String[] profiles = this.environment.getActiveProfiles(); + if (ObjectUtils.isEmpty(profiles)) { + message.append(" (no profiles are currently active)."); + } + else { + message.append(" (the profiles "); + message.append(StringUtils.arrayToCommaDelimitedString(profiles)); + message.append(" are currently active)."); + } + } + return message.toString(); + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java index 63ff671b9fab..81651f3d3081 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java @@ -32,11 +32,8 @@ import org.springframework.boot.jdbc.DataSourceInitializationMode; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** @@ -47,16 +44,15 @@ * @author Stephane Nicoll * @author Benedikt Ritter * @author EddĂș MelĂ©ndez + * @author Patryk Kostrzewa * @since 1.1.0 */ @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties - implements BeanClassLoaderAware, EnvironmentAware, InitializingBean { + implements BeanClassLoaderAware, InitializingBean { private ClassLoader classLoader; - private Environment environment; - /** * Name of the datasource. Default to "testdb" when using an embedded database. */ @@ -166,11 +162,6 @@ public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } - @Override public void afterPropertiesSet() throws Exception { this.embeddedDatabaseConnection = EmbeddedDatabaseConnection @@ -244,8 +235,9 @@ public String determineDriverClassName() { driverClassName = this.embeddedDatabaseConnection.getDriverClassName(); } if (!StringUtils.hasText(driverClassName)) { - throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection, - this.environment, "driver class"); + throw new DataSourceBeanCreationException( + "Failed to determine a suitable driver class", + this.embeddedDatabaseConnection); } return driverClassName; } @@ -290,8 +282,9 @@ public String determineUrl() { String url = (databaseName == null ? null : this.embeddedDatabaseConnection.getUrl(databaseName)); if (!StringUtils.hasText(url)) { - throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection, - this.environment, "url"); + throw new DataSourceBeanCreationException( + "Failed to determine suitable jdbc url", + this.embeddedDatabaseConnection); } return url; } @@ -522,37 +515,17 @@ public void setProperties(Map properties) { static class DataSourceBeanCreationException extends BeanCreationException { - DataSourceBeanCreationException(EmbeddedDatabaseConnection connection, - Environment environment, String property) { - super(getMessage(connection, environment, property)); - } + private final EmbeddedDatabaseConnection connection; - private static String getMessage(EmbeddedDatabaseConnection connection, - Environment environment, String property) { - StringBuilder message = new StringBuilder(); - message.append("Cannot determine embedded database " + property - + " for database type " + connection + ". "); - message.append("If you want an embedded database please put a supported " - + "one on the classpath. "); - message.append("If you have database settings to be loaded from a " - + "particular profile you may need to active it"); - if (environment != null) { - String[] profiles = environment.getActiveProfiles(); - if (ObjectUtils.isEmpty(profiles)) { - message.append(" (no profiles are currently active)"); - } - else { - message.append(" (the profiles \"" - + StringUtils.arrayToCommaDelimitedString( - environment.getActiveProfiles()) - + "\" are currently active)"); - - } - } - message.append("."); - return message.toString(); + DataSourceBeanCreationException(String message, + EmbeddedDatabaseConnection connection) { + + super(message); + this.connection = connection; } + public EmbeddedDatabaseConnection getConnection() { + return this.connection; + } } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java index 081d53ef687c..a3bce95f3135 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java @@ -41,12 +41,8 @@ public class DataSourceBeanCreationFailureAnalyzerTests { @Test public void failureAnalysisIsPerformed() { FailureAnalysis failureAnalysis = performAnalysis(TestConfiguration.class); - assertThat(failureAnalysis.getDescription()).isEqualTo( - "Cannot determine embedded database driver class for database type NONE"); - assertThat(failureAnalysis.getAction()).isEqualTo("If you want an embedded " - + "database please put a supported one on the classpath. If you have " - + "database settings to be loaded from a particular profile you may " - + "need to active it (no profiles are currently active)."); + assertThat(failureAnalysis.getDescription()).isEqualTo("Failed to determine a suitable driver class"); + assertThat(failureAnalysis.getAction()).isEqualTo("If you want an embedded database please put a supported one on the classpath."); } private FailureAnalysis performAnalysis(Class configuration) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java index f0d8dcbb9ce8..d49dc76dd374 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java @@ -72,7 +72,7 @@ public void determineUrlWithNoEmbeddedSupport() throws Exception { new FilteredClassLoader("org.h2", "org.apache.derby", "org.hsqldb")); properties.afterPropertiesSet(); this.thrown.expect(DataSourceProperties.DataSourceBeanCreationException.class); - this.thrown.expectMessage("Cannot determine embedded database url"); + this.thrown.expectMessage("Failed to determine suitable jdbc url"); properties.determineUrl(); }