diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java new file mode 100644 index 00000000000..37f6b17f74f --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2016 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.jdbc; + +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.DataSourceBeanCreationException; +import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; +import org.springframework.boot.diagnostics.FailureAnalysis; + +/** + * An {@link AbstractFailureAnalyzer} for failures caused by a + * {@link DataSourceBeanCreationException}. + * + * @author Andy Wilkinson + */ +class DataSourceBeanCreationFailureAnalyzer + extends AbstractFailureAnalyzer { + + @Override + protected FailureAnalysis analyze(Throwable rootFailure, + DataSourceBeanCreationException cause) { + String description = cause.getMessage() + .substring(0, cause.getMessage().indexOf(".")).trim(); + String action = cause.getMessage().substring(cause.getMessage().indexOf(".") + 1) + .trim(); + return new FailureAnalysis(description, action, cause); + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java index 0adaf1360ee..ae600505a39 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java @@ -415,7 +415,7 @@ public class DataSourceProperties } - private static class DataSourceBeanCreationException extends BeanCreationException { + static class DataSourceBeanCreationException extends BeanCreationException { DataSourceBeanCreationException(EmbeddedDatabaseConnection connection, Environment environment, String property) { diff --git a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 1d87439c0f8..b589ab2402f 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -99,6 +99,10 @@ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration +# Failure analyzers +org.springframework.boot.diagnostics.FailureAnalyzer=\ +org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer + # Template availability providers org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java new file mode 100644 index 00000000000..dbaeb9a1128 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBeanCreationFailureAnalyzerTests.java @@ -0,0 +1,74 @@ +/* + * Copyright 2012-2016 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.jdbc; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.diagnostics.FailureAnalysis; +import org.springframework.boot.testutil.ClassPathExclusions; +import org.springframework.boot.testutil.FilteredClassPathRunner; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DataSourceBeanCreationFailureAnalyzer}. + * + * @author Andy Wilkinson + */ +@RunWith(FilteredClassPathRunner.class) +@ClassPathExclusions({ "h2-*.jar", "hsqldb-*.jar" }) +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)."); + } + + private FailureAnalysis performAnalysis(Class configuration) { + BeanCreationException failure = createFailure(configuration); + assertThat(failure).isNotNull(); + return new DataSourceBeanCreationFailureAnalyzer().analyze(failure); + } + + private BeanCreationException createFailure(Class configuration) { + try { + new AnnotationConfigApplicationContext(configuration).close(); + return null; + } + catch (BeanCreationException ex) { + return ex; + } + } + + @Configuration + @ImportAutoConfiguration(DataSourceAutoConfiguration.class) + static class TestConfiguration { + + } + +}