Merge branch '1.5.x'

This commit is contained in:
Andy Wilkinson 2017-06-02 11:25:32 +01:00
commit 8c1820afe3
2 changed files with 46 additions and 6 deletions

View File

@ -39,28 +39,40 @@ class BeanCurrentlyInCreationFailureAnalyzer
@Override @Override
protected FailureAnalysis analyze(Throwable rootFailure, protected FailureAnalysis analyze(Throwable rootFailure,
BeanCurrentlyInCreationException cause) { BeanCurrentlyInCreationException cause) {
List<BeanInCycle> cycle = new ArrayList<>(); DependencyCycle dependencyCycle = findCycle(rootFailure);
if (dependencyCycle == null) {
return null;
}
return new FailureAnalysis(buildMessage(dependencyCycle), null, cause);
}
private DependencyCycle findCycle(Throwable rootFailure) {
List<BeanInCycle> beansInCycle = new ArrayList<>();
Throwable candidate = rootFailure; Throwable candidate = rootFailure;
int cycleStart = -1; int cycleStart = -1;
while (candidate != null) { while (candidate != null) {
BeanInCycle beanInCycle = BeanInCycle.get(candidate); BeanInCycle beanInCycle = BeanInCycle.get(candidate);
if (beanInCycle != null) { if (beanInCycle != null) {
int index = cycle.indexOf(beanInCycle); int index = beansInCycle.indexOf(beanInCycle);
if (index == -1) { if (index == -1) {
cycle.add(beanInCycle); beansInCycle.add(beanInCycle);
} }
cycleStart = (cycleStart == -1 ? index : cycleStart); cycleStart = (cycleStart == -1 ? index : cycleStart);
} }
candidate = candidate.getCause(); candidate = candidate.getCause();
} }
String message = buildMessage(cycle, cycleStart); if (cycleStart == -1) {
return new FailureAnalysis(message, null, cause); return null;
}
return new DependencyCycle(beansInCycle, cycleStart);
} }
private String buildMessage(List<BeanInCycle> beansInCycle, int cycleStart) { private String buildMessage(DependencyCycle dependencyCycle) {
StringBuilder message = new StringBuilder(); StringBuilder message = new StringBuilder();
message.append(String.format("The dependencies of some of the beans in the " message.append(String.format("The dependencies of some of the beans in the "
+ "application context form a cycle:%n%n")); + "application context form a cycle:%n%n"));
List<BeanInCycle> beansInCycle = dependencyCycle.getBeansInCycle();
int cycleStart = dependencyCycle.getCycleStart();
for (int i = 0; i < beansInCycle.size(); i++) { for (int i = 0; i < beansInCycle.size(); i++) {
BeanInCycle beanInCycle = beansInCycle.get(i); BeanInCycle beanInCycle = beansInCycle.get(i);
if (i == cycleStart) { if (i == cycleStart) {
@ -77,6 +89,27 @@ class BeanCurrentlyInCreationFailureAnalyzer
return message.toString(); return message.toString();
} }
private static final class DependencyCycle {
private final List<BeanInCycle> beansInCycle;
private final int cycleStart;
private DependencyCycle(List<BeanInCycle> beansInCycle, int cycleStart) {
this.beansInCycle = beansInCycle;
this.cycleStart = cycleStart;
}
public List<BeanInCycle> getBeansInCycle() {
return this.beansInCycle;
}
public int getCycleStart() {
return this.cycleStart;
}
}
private static final class BeanInCycle { private static final class BeanInCycle {
private final String name; private final String name;

View File

@ -24,6 +24,7 @@ import java.util.List;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.BeanCurrentlyInCreationException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.diagnostics.FailureAnalysis; import org.springframework.boot.diagnostics.FailureAnalysis;
import org.springframework.boot.diagnostics.FailureAnalyzer; import org.springframework.boot.diagnostics.FailureAnalyzer;
@ -116,6 +117,12 @@ public class BeanCurrentlyInCreationFailureAnalyzerTests {
assertThat(lines.get(11)).isEqualTo("└─────┘"); assertThat(lines.get(11)).isEqualTo("└─────┘");
} }
@Test
public void cycleWithAnUnknownStartIsNotAnalyzed() throws IOException {
assertThat(this.analyzer.analyze(new BeanCurrentlyInCreationException("test")))
.isNull();
}
private List<String> readDescriptionLines(FailureAnalysis analysis) private List<String> readDescriptionLines(FailureAnalysis analysis)
throws IOException { throws IOException {
try (BufferedReader lineReader = new BufferedReader( try (BufferedReader lineReader = new BufferedReader(