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 b8dab15000..e818bdc9d2 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 @@ -161,20 +161,31 @@ public class EnableAutoConfigurationImportSelector private void checkExcludedClasses(List configurations, Set exclusions) { - StringBuilder message = new StringBuilder(); + List invalidExcludes = new ArrayList(); for (String exclusion : exclusions) { if (ClassUtils.isPresent(exclusion, getClass().getClassLoader()) && !configurations.contains(exclusion)) { - message.append("\t- ").append(exclusion).append(String.format("%n")); + invalidExcludes.add(exclusion); } } - if (!message.toString().isEmpty()) { - throw new IllegalStateException(String.format( - "The following classes could not be excluded because they are" - + " not auto-configuration classes:%n%s", - message.toString())); + if (!invalidExcludes.isEmpty()) { + handleInvalidExcludes(invalidExcludes); } + } + /** + * Handle any invalid excludes that have been specified. + * @param invalidExcludes the list of invalid excludes (will always have at least on + * element) + */ + protected void handleInvalidExcludes(List invalidExcludes) { + StringBuilder message = new StringBuilder(); + for (String exclude : invalidExcludes) { + message.append("\t- ").append(exclude).append(String.format("%n")); + } + throw new IllegalStateException(String + .format("The following classes could not be excluded because they are" + + " not auto-configuration classes:%n%s", message)); } /** diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java index 90abf076f8..44021075a9 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java @@ -146,4 +146,9 @@ class ImportAutoConfigurationImportSelector return super.getOrder() - 1; } + @Override + protected void handleInvalidExcludes(List invalidExcludes) { + // Ignore for test + } + } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java index 60f274ecbb..bb0587b01c 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java @@ -116,6 +116,15 @@ public class ImportAutoConfigurationImportSelectorTests { assertThat(imports).containsOnly(FreeMarkerAutoConfiguration.class.getName()); } + @Test + public void exclusionsWithoutImport() throws Exception { + AnnotationMetadata annotationMetadata = new SimpleMetadataReaderFactory() + .getMetadataReader(ExclusionWithoutImport.class.getName()) + .getAnnotationMetadata(); + String[] imports = this.importSelector.selectImports(annotationMetadata); + assertThat(imports).containsOnly(FreeMarkerAutoConfiguration.class.getName()); + } + @Test public void exclusionsAliasesAreApplied() throws Exception { AnnotationMetadata annotationMetadata = new SimpleMetadataReaderFactory() @@ -149,6 +158,12 @@ public class ImportAutoConfigurationImportSelectorTests { } + @ImportOne + @ImportAutoConfiguration(exclude = ThymeleafAutoConfiguration.class) + static class ExclusionWithoutImport { + + } + @SelfAnnotating static class ImportWithSelfAnnotatingAnnotation {