From eed58eecb4b5d486736bbf013cc44bf64b8b5dc4 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 16 Sep 2014 15:56:22 +0100 Subject: [PATCH] Improve error handling in EnableAutoConfigurationImportSelector Previously, EnableAutoConfigurationImportSelector assumed that it would always find auto-configuration attributes from an @EnableAutoConfiguration annotation. This assumption does not hold true in certain circumstances, although exactly what those circumstances are is unclear. It could occur if the import selector were used directly, but it's package-private making that unlikey. In such circumstances a NullPointerException was being thrown. This commit asserts that the attributes are non-null and, should the assertion fail, produces an error that is more helpful than an NPE. Closes gh-1512 --- .../EnableAutoConfigurationImportSelector.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelector.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelector.java index ad27704bdc1..fc5a0bde104 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelector.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelector.java @@ -31,12 +31,14 @@ import org.springframework.core.annotation.Order; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.Assert; /** * {@link DeferredImportSelector} to handle {@link EnableAutoConfiguration * auto-configuration}. * * @author Phillip Webb + * @author Andy Wilkinson * @see EnableAutoConfiguration */ @Order(Ordered.LOWEST_PRECEDENCE) @@ -54,6 +56,10 @@ class EnableAutoConfigurationImportSelector implements DeferredImportSelector, .getAnnotationAttributes(EnableAutoConfiguration.class.getName(), true)); + Assert.notNull(attributes, "No auto-configuration attributes found. Is " + + metadata.getClassName() + + " annotated with @EnableAutoConfiguration?"); + // Find all possible auto configuration classes, filtering duplicates List factories = new ArrayList(new LinkedHashSet( SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,