Skip to content

Commit ef9910c

Browse files
committed
ConfigurationClassParser ignores unresolvable member classes
Issue: SPR-13115 (cherry picked from commit 1c01f57)
1 parent 33b9bd7 commit ef9910c

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import org.springframework.core.type.classreading.MetadataReaderFactory;
7474
import org.springframework.core.type.filter.AssignableTypeFilter;
7575
import org.springframework.util.Assert;
76+
import org.springframework.util.CollectionUtils;
7677
import org.springframework.util.LinkedMultiValueMap;
7778
import org.springframework.util.MultiValueMap;
7879
import org.springframework.util.StringUtils;
@@ -447,7 +448,7 @@ private void processImports(ConfigurationClass configClass, SourceClass currentS
447448
}
448449

449450
if (checkForCircularImports && this.importStack.contains(configClass)) {
450-
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack, configClass.getMetadata()));
451+
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack));
451452
}
452453
else {
453454
this.importStack.push(configClass);
@@ -620,7 +621,7 @@ public void removeImportingClassFor(String importedClass) {
620621
@Override
621622
public AnnotationMetadata getImportingClassFor(String importedClass) {
622623
List<AnnotationMetadata> list = this.imports.get(importedClass);
623-
return (list == null || list.isEmpty() ? null : list.get(list.size() - 1));
624+
return (!CollectionUtils.isEmpty(list) ? list.get(list.size() - 1) : null);
624625
}
625626

626627
/**
@@ -634,7 +635,7 @@ public boolean contains(Object elem) {
634635
Comparator<ConfigurationClass> comparator = new Comparator<ConfigurationClass>() {
635636
@Override
636637
public int compare(ConfigurationClass first, ConfigurationClass second) {
637-
return first.getMetadata().getClassName().equals(second.getMetadata().getClassName()) ? 0 : 1;
638+
return (first.getMetadata().getClassName().equals(second.getMetadata().getClassName()) ? 0 : 1);
638639
}
639640
};
640641
return (Collections.binarySearch(this, configClass, comparator) != -1);
@@ -647,11 +648,11 @@ public int compare(ConfigurationClass first, ConfigurationClass second) {
647648
* <li>com.acme.Bar</li>
648649
* <li>com.acme.Baz</li>
649650
* </ul>
650-
* return "ImportStack: [Foo->Bar->Baz]".
651+
* return "[Foo->Bar->Baz]".
651652
*/
652653
@Override
653654
public String toString() {
654-
StringBuilder builder = new StringBuilder("ImportStack: [");
655+
StringBuilder builder = new StringBuilder("[");
655656
Iterator<ConfigurationClass> iterator = iterator();
656657
while (iterator.hasNext()) {
657658
builder.append(iterator.next().getSimpleName());
@@ -755,7 +756,16 @@ public Collection<SourceClass> getMemberClasses() throws IOException {
755756
String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames();
756757
List<SourceClass> members = new ArrayList<SourceClass>(memberClassNames.length);
757758
for (String memberClassName : memberClassNames) {
758-
members.add(asSourceClass(memberClassName));
759+
try {
760+
members.add(asSourceClass(memberClassName));
761+
}
762+
catch (IOException ex) {
763+
// Let's skip it if it's not resolvable - we're just looking for candidates
764+
if (logger.isDebugEnabled()) {
765+
logger.debug("Failed to resolve member class [" + memberClassName +
766+
"] - not considering it as a configuration class candidate");
767+
}
768+
}
759769
}
760770
return members;
761771
}
@@ -834,12 +844,12 @@ public String toString() {
834844
*/
835845
private static class CircularImportProblem extends Problem {
836846

837-
public CircularImportProblem(ConfigurationClass attemptedImport, Stack<ConfigurationClass> importStack, AnnotationMetadata metadata) {
847+
public CircularImportProblem(ConfigurationClass attemptedImport, Stack<ConfigurationClass> importStack) {
838848
super(String.format("A circular @Import has been detected: " +
839849
"Illegal attempt by @Configuration class '%s' to import class '%s' as '%s' is " +
840-
"already present in the current import stack [%s]", importStack.peek().getSimpleName(),
850+
"already present in the current import stack %s", importStack.peek().getSimpleName(),
841851
attemptedImport.getSimpleName(), attemptedImport.getSimpleName(), importStack),
842-
new Location(importStack.peek().getResource(), metadata));
852+
new Location(importStack.peek().getResource(), attemptedImport.getMetadata()));
843853
}
844854
}
845855

0 commit comments

Comments
 (0)