From 044c902a8cc734e8a77f339575c626f3d56fde3a Mon Sep 17 00:00:00 2001 From: Roman Zabaluev Date: Wed, 28 Apr 2021 23:07:27 +0300 Subject: [PATCH] Improve failure analysis with a single bean cycle See gh-26292 --- ...eanCurrentlyInCreationFailureAnalyzer.java | 4 +-- ...rrentlyInCreationFailureAnalyzerTests.java | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) 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 4e028fbbb01..a67ac2bb2dc 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 @@ class BeanCurrentlyInCreationFailureAnalyzer extends AbstractFailureAnalyzer──┐%n" : "┌─────┐%n")); } else if (i > 0) { String leftSide = (i < cycleStart) ? " " : "↑"; @@ -83,7 +83,7 @@ class BeanCurrentlyInCreationFailureAnalyzer extends AbstractFailureAnalyzer 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 @@ class BeanCurrentlyInCreationFailureAnalyzerTests { } @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) + @SuppressWarnings("unused") static class CyclicBeanMethodsConfiguration { @Bean @@ -167,6 +181,7 @@ class BeanCurrentlyInCreationFailureAnalyzerTests { } @Configuration(proxyBeanMethods = false) + @SuppressWarnings("unused") static class CycleReferencedViaOtherBeansConfiguration { @Bean @@ -231,6 +246,7 @@ class BeanCurrentlyInCreationFailureAnalyzerTests { @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) static class BeanThreeConfiguration { + @SuppressWarnings("unused") @Bean BeanThree three(BeanOne one) { 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 { @Autowired @@ -266,4 +293,11 @@ class BeanCurrentlyInCreationFailureAnalyzerTests { } + static class SelfReferenceBean { + + @Autowired + SelfReferenceBean bean; + + } + }