diff --git a/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java b/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java index 2f9f800e910..cc93bbc86b1 100644 --- a/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java +++ b/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java @@ -115,9 +115,14 @@ public final class FailureAnalyzers { private FailureAnalysis analyze(Throwable failure, List analyzers) { for (FailureAnalyzer analyzer : analyzers) { - FailureAnalysis analysis = analyzer.analyze(failure); - if (analysis != null) { - return analysis; + try { + FailureAnalysis analysis = analyzer.analyze(failure); + if (analysis != null) { + return analysis; + } + } + catch (Throwable ex) { + log.debug("FailureAnalyzer " + analyzer + " failed", ex); } } return null; diff --git a/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java b/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java index 83aa28cf80f..2b1c6fdcb4c 100644 --- a/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java @@ -62,9 +62,16 @@ public class FailureAnalyzersTests { } @Test - public void brokenAnalyzerDoesNotPreventOtherAnalyzersFromBeingCalled() { + public void analyzerThatFailsDuringInitializationDoesNotPreventOtherAnalyzersFromBeingCalled() { RuntimeException failure = new RuntimeException(); - analyzeAndReport("broken.factories", failure); + analyzeAndReport("broken-initialization.factories", failure); + verify(failureAnalyzer, times(1)).analyze(failure); + } + + @Test + public void analyzerThatFailsDuringAnalysisDoesNotPreventOtherAnalyzersFromBeingCalled() { + RuntimeException failure = new RuntimeException(); + analyzeAndReport("broken-analysis.factories", failure); verify(failureAnalyzer, times(1)).analyze(failure); } @@ -83,7 +90,7 @@ public class FailureAnalyzersTests { } - static class BrokenFailureAnalyzer implements FailureAnalyzer { + static class BrokenInitializationFailureAnalyzer implements FailureAnalyzer { static { Object foo = null; @@ -97,6 +104,15 @@ public class FailureAnalyzersTests { } + static class BrokenAnalysisFailureAnalyzer implements FailureAnalyzer { + + @Override + public FailureAnalysis analyze(Throwable failure) { + throw new NoClassDefFoundError(); + } + + } + interface BeanFactoryAwareFailureAnalyzer extends BeanFactoryAware, FailureAnalyzer { } diff --git a/spring-boot/src/test/resources/failure-analyzers-tests/broken.factories b/spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories similarity index 89% rename from spring-boot/src/test/resources/failure-analyzers-tests/broken.factories rename to spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories index 8f9e5e4d91b..b1dce498466 100644 --- a/spring-boot/src/test/resources/failure-analyzers-tests/broken.factories +++ b/spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories @@ -1,4 +1,4 @@ # Failure Analyzers org.springframework.boot.diagnostics.FailureAnalyzer=\ -org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenFailureAnalyzer,\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenAnalysisFailureAnalyzer,\ org.springframework.boot.diagnostics.FailureAnalyzersTests$BasicFailureAnalyzer diff --git a/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories b/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories new file mode 100644 index 00000000000..b1dce498466 --- /dev/null +++ b/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories @@ -0,0 +1,4 @@ +# Failure Analyzers +org.springframework.boot.diagnostics.FailureAnalyzer=\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenAnalysisFailureAnalyzer,\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BasicFailureAnalyzer