diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzer.java index 4e028fbbb017..a67ac2bb2dc8 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzer.java @@ -74,7 +74,7 @@ private String buildMessage(DependencyCycle dependencyCycle) { for (int i = 0; i < beansInCycle.size(); i++) { BeanInCycle beanInCycle = beansInCycle.get(i); if (i == cycleStart) { - message.append(String.format("┌─────┐%n")); + message.append(String.format((beansInCycle.size() == 1) ? "┌──->──┐%n" : "┌─────┐%n")); } else if (i > 0) { String leftSide = (i < cycleStart) ? " " : "↑"; @@ -83,7 +83,7 @@ else if (i > 0) { String leftSide = (i < cycleStart) ? " " : "|"; 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(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzerTests.java index 541b5c9a53ac..4b6636b5d665 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanCurrentlyInCreationFailureAnalyzerTests.java @@ -109,6 +109,19 @@ void cycleReferencedViaOtherBeans() throws IOException { assertThat(lines.get(11)).isEqualTo("└─────┘"); } + @Test + void testSelfReferenceCycle() throws IOException { + FailureAnalysis analysis = performAnalysis(SelfReferenceBeanConfiguration.class); + List 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 void cycleWithAnUnknownStartIsNotAnalyzed() { assertThat(this.analyzer.analyze(new BeanCurrentlyInCreationException("test"))).isNull(); @@ -137,6 +150,7 @@ private Exception createFailure(Class configuration) { } @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) + @SuppressWarnings("unused") static class CyclicBeanMethodsConfiguration { @Bean @@ -167,6 +181,7 @@ BeanOne one(BeanTwo two) { } @Configuration(proxyBeanMethods = false) + @SuppressWarnings("unused") static class CycleReferencedViaOtherBeansConfiguration { @Bean @@ -231,6 +246,7 @@ BeanTwo two() { @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) static class BeanThreeConfiguration { + @SuppressWarnings("unused") @Bean BeanThree three(BeanOne one) { return new BeanThree(); @@ -240,6 +256,17 @@ BeanThree three(BeanOne one) { } + @Configuration(proxyBeanMethods = false) + static class SelfReferenceBeanConfiguration { + + @SuppressWarnings("unused") + @Bean + SelfReferenceBean bean(SelfReferenceBean bean) { + return new SelfReferenceBean(); + } + + } + static class RefererOne { @Autowired @@ -266,4 +293,11 @@ static class BeanThree { } + static class SelfReferenceBean { + + @Autowired + SelfReferenceBean bean; + + } + }