diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/SpringBootCondition.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/SpringBootCondition.java index 461c2417b57..055865795a4 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/SpringBootCondition.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/SpringBootCondition.java @@ -21,6 +21,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.ClassMetadata; import org.springframework.core.type.MethodMetadata; import org.springframework.util.ClassUtils; @@ -53,6 +54,22 @@ public abstract class SpringBootCondition implements Condition { + "springframework package (e.g. if you put a @ComponentScan " + "in the default package by mistake)", ex); } + catch (RuntimeException ex) { + throw new IllegalStateException("Error processing condition on " + + getName(metadata), ex); + } + } + + private String getName(AnnotatedTypeMetadata metadata) { + if (metadata instanceof AnnotationMetadata) { + return ((AnnotationMetadata) metadata).getClassName(); + } + if (metadata instanceof MethodMetadata) { + MethodMetadata methodMetadata = (MethodMetadata) metadata; + return methodMetadata.getDeclaringClassName() + "." + + methodMetadata.getMethodName(); + } + return metadata.toString(); } private static String getClassOrMethodName(AnnotatedTypeMetadata metadata) { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/SpringBootConditionTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/SpringBootConditionTests.java new file mode 100644 index 00000000000..4cce8bbdba2 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/SpringBootConditionTests.java @@ -0,0 +1,83 @@ +/* + * Copyright 2012-2014 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.condition; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * Tests for {@link SpringBootCondition}. + * + * @author Phillip Webb + */ +@SuppressWarnings("resource") +public class SpringBootConditionTests { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void sensibleClassException() { + this.thrown.expect(IllegalStateException.class); + this.thrown.expectMessage("Error processing condition on " + + ErrorOnClass.class.getName()); + new AnnotationConfigApplicationContext(ErrorOnClass.class); + } + + @Test + public void sensibleMethodException() throws Exception { + this.thrown.expect(IllegalStateException.class); + this.thrown.expectMessage("Error processing condition on " + + ErrorOnMethod.class.getName() + ".myBean"); + new AnnotationConfigApplicationContext(ErrorOnMethod.class); + } + + @Configuration + @Conditional(AlwaysThrowsCondition.class) + public static class ErrorOnClass { + + } + + @Configuration + public static class ErrorOnMethod { + + @Bean + @Conditional(AlwaysThrowsCondition.class) + public String myBean() { + return "bean"; + } + + } + + public static class AlwaysThrowsCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + throw new RuntimeException("Oh no!"); + } + + } + +}