From ef9910c3c48cc56b655f189a4362cbc8907b7e61 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 16 Jun 2015 01:42:35 +0200 Subject: [PATCH] ConfigurationClassParser ignores unresolvable member classes Issue: SPR-13115 (cherry picked from commit 1c01f57) --- .../annotation/ConfigurationClassParser.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 7a38ac7755..5b61596309 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -73,6 +73,7 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -447,7 +448,7 @@ class ConfigurationClassParser { } if (checkForCircularImports && this.importStack.contains(configClass)) { - this.problemReporter.error(new CircularImportProblem(configClass, this.importStack, configClass.getMetadata())); + this.problemReporter.error(new CircularImportProblem(configClass, this.importStack)); } else { this.importStack.push(configClass); @@ -620,7 +621,7 @@ class ConfigurationClassParser { @Override public AnnotationMetadata getImportingClassFor(String importedClass) { List list = this.imports.get(importedClass); - return (list == null || list.isEmpty() ? null : list.get(list.size() - 1)); + return (!CollectionUtils.isEmpty(list) ? list.get(list.size() - 1) : null); } /** @@ -634,7 +635,7 @@ class ConfigurationClassParser { Comparator comparator = new Comparator() { @Override public int compare(ConfigurationClass first, ConfigurationClass second) { - return first.getMetadata().getClassName().equals(second.getMetadata().getClassName()) ? 0 : 1; + return (first.getMetadata().getClassName().equals(second.getMetadata().getClassName()) ? 0 : 1); } }; return (Collections.binarySearch(this, configClass, comparator) != -1); @@ -647,11 +648,11 @@ class ConfigurationClassParser { *
  • com.acme.Bar
  • *
  • com.acme.Baz
  • * - * return "ImportStack: [Foo->Bar->Baz]". + * return "[Foo->Bar->Baz]". */ @Override public String toString() { - StringBuilder builder = new StringBuilder("ImportStack: ["); + StringBuilder builder = new StringBuilder("["); Iterator iterator = iterator(); while (iterator.hasNext()) { builder.append(iterator.next().getSimpleName()); @@ -755,7 +756,16 @@ class ConfigurationClassParser { String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames(); List members = new ArrayList(memberClassNames.length); for (String memberClassName : memberClassNames) { - members.add(asSourceClass(memberClassName)); + try { + members.add(asSourceClass(memberClassName)); + } + catch (IOException ex) { + // Let's skip it if it's not resolvable - we're just looking for candidates + if (logger.isDebugEnabled()) { + logger.debug("Failed to resolve member class [" + memberClassName + + "] - not considering it as a configuration class candidate"); + } + } } return members; } @@ -834,12 +844,12 @@ class ConfigurationClassParser { */ private static class CircularImportProblem extends Problem { - public CircularImportProblem(ConfigurationClass attemptedImport, Stack importStack, AnnotationMetadata metadata) { + public CircularImportProblem(ConfigurationClass attemptedImport, Stack importStack) { super(String.format("A circular @Import has been detected: " + "Illegal attempt by @Configuration class '%s' to import class '%s' as '%s' is " + - "already present in the current import stack [%s]", importStack.peek().getSimpleName(), + "already present in the current import stack %s", importStack.peek().getSimpleName(), attemptedImport.getSimpleName(), attemptedImport.getSimpleName(), importStack), - new Location(importStack.peek().getResource(), metadata)); + new Location(importStack.peek().getResource(), attemptedImport.getMetadata())); } }