From 7c9ac03014779bc0bc4eba1b00636e6471878c41 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 23 Oct 2019 12:37:42 -0700 Subject: [PATCH] Filter empty health contributions Update `HealthEndpointSupport` so that aggregate elements that don't ultimately provide a contribution are filtered out. Prior to this commit an NPE was returned when calculating the aggregate status. Fixes gh-18687 --- .../boot/actuate/health/HealthEndpointSupport.java | 8 +++++--- .../boot/actuate/health/HealthEndpointSupportTests.java | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthEndpointSupport.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthEndpointSupport.java index c82e6201382..848f1786c18 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthEndpointSupport.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthEndpointSupport.java @@ -112,10 +112,12 @@ abstract class HealthEndpointSupport { Map contributions = new LinkedHashMap<>(); for (NamedContributor namedContributor : namedContributors) { String name = namedContributor.getName(); + C contributor = namedContributor.getContributor(); if (group.isMember(name)) { - T contribution = getContribution(apiVersion, group, namedContributor.getContributor(), showComponents, - showDetails, null); - contributions.put(name, contribution); + T contribution = getContribution(apiVersion, group, contributor, showComponents, showDetails, null); + if (contribution != null) { + contributions.put(name, contribution); + } } } if (contributions.isEmpty()) { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthEndpointSupportTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthEndpointSupportTests.java index 60e1421b382..2f65c871db2 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthEndpointSupportTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthEndpointSupportTests.java @@ -207,6 +207,14 @@ abstract class HealthEndpointSupportTests, C, T assertThat(getHealth(result)).isNotInstanceOf(SystemHealth.class); } + @Test + void getHealthWithEmptyCompositeReturnsNullResult() { // gh-18687 + this.registry.registerContributor("test", createCompositeContributor(Collections.emptyMap())); + HealthResult result = create(this.registry, this.groups).getHealth(ApiVersion.V3, SecurityContext.NONE, + false); + assertThat(result).isNull(); + } + protected abstract HealthEndpointSupport create(R registry, HealthEndpointGroups groups); protected abstract R createRegistry();