Improve failure analysis with a single bean cycle
See gh-26292
This commit is contained in:
parent
3f528bb0eb
commit
044c902a8c
|
|
@ -74,7 +74,7 @@ class BeanCurrentlyInCreationFailureAnalyzer extends AbstractFailureAnalyzer<Bea
|
||||||
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) {
|
||||||
message.append(String.format("┌─────┐%n"));
|
message.append(String.format((beansInCycle.size() == 1) ? "┌──->──┐%n" : "┌─────┐%n"));
|
||||||
}
|
}
|
||||||
else if (i > 0) {
|
else if (i > 0) {
|
||||||
String leftSide = (i < cycleStart) ? " " : "↑";
|
String leftSide = (i < cycleStart) ? " " : "↑";
|
||||||
|
|
@ -83,7 +83,7 @@ class BeanCurrentlyInCreationFailureAnalyzer extends AbstractFailureAnalyzer<Bea
|
||||||
String leftSide = (i < cycleStart) ? " " : "|";
|
String leftSide = (i < cycleStart) ? " " : "|";
|
||||||
message.append(String.format("%s %s%n", leftSide, beanInCycle));
|
message.append(String.format("%s %s%n", leftSide, beanInCycle));
|
||||||
}
|
}
|
||||||
message.append(String.format("└─────┘%n"));
|
message.append(String.format((beansInCycle.size() == 1) ? "└──<-──┘%n" : "└─────┘%n"));
|
||||||
return message.toString();
|
return message.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,19 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
assertThat(lines.get(11)).isEqualTo("└─────┘");
|
assertThat(lines.get(11)).isEqualTo("└─────┘");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSelfReferenceCycle() throws IOException {
|
||||||
|
FailureAnalysis analysis = performAnalysis(SelfReferenceBeanConfiguration.class);
|
||||||
|
List<String> lines = readDescriptionLines(analysis);
|
||||||
|
assertThat(lines).hasSize(5);
|
||||||
|
assertThat(lines.get(0))
|
||||||
|
.isEqualTo("The dependencies of some of the beans in the application context form a cycle:");
|
||||||
|
assertThat(lines.get(1)).isEqualTo("");
|
||||||
|
assertThat(lines.get(2)).isEqualTo("┌──->──┐");
|
||||||
|
assertThat(lines.get(3)).startsWith("| bean defined in " + SelfReferenceBeanConfiguration.class.getName());
|
||||||
|
assertThat(lines.get(4)).isEqualTo("└──<-──┘");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void cycleWithAnUnknownStartIsNotAnalyzed() {
|
void cycleWithAnUnknownStartIsNotAnalyzed() {
|
||||||
assertThat(this.analyzer.analyze(new BeanCurrentlyInCreationException("test"))).isNull();
|
assertThat(this.analyzer.analyze(new BeanCurrentlyInCreationException("test"))).isNull();
|
||||||
|
|
@ -137,6 +150,7 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
|
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
|
||||||
|
@SuppressWarnings("unused")
|
||||||
static class CyclicBeanMethodsConfiguration {
|
static class CyclicBeanMethodsConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
@ -167,6 +181,7 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
@SuppressWarnings("unused")
|
||||||
static class CycleReferencedViaOtherBeansConfiguration {
|
static class CycleReferencedViaOtherBeansConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
@ -231,6 +246,7 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
|
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
|
||||||
static class BeanThreeConfiguration {
|
static class BeanThreeConfiguration {
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
@Bean
|
@Bean
|
||||||
BeanThree three(BeanOne one) {
|
BeanThree three(BeanOne one) {
|
||||||
return new BeanThree();
|
return new BeanThree();
|
||||||
|
|
@ -240,6 +256,17 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
static class SelfReferenceBeanConfiguration {
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@Bean
|
||||||
|
SelfReferenceBean bean(SelfReferenceBean bean) {
|
||||||
|
return new SelfReferenceBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static class RefererOne {
|
static class RefererOne {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -266,4 +293,11 @@ class BeanCurrentlyInCreationFailureAnalyzerTests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class SelfReferenceBean {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
SelfReferenceBean bean;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue