Skip to content

Commit 8549336

Browse files
committed
Rework health response structure to eliminate chance of key clashes
Previously, if a health's details contained a key named status (either because an indicator bean was named statusHealthIndicator or an indicator added an entry named status to its details) this would clash with the health's own status as the details were serialized as siblings of the status field. This commit updates Health to remove @JsonAnyGetter from getDetails(). This means that all of a Health's details will now be nested within a separate details field, thereby preventing a possible clash with the status field. Closes gh-10249
1 parent bc9d8bb commit 8549336

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

Diff for: spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Health.java

-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.LinkedHashMap;
2121
import java.util.Map;
2222

23-
import com.fasterxml.jackson.annotation.JsonAnyGetter;
2423
import com.fasterxml.jackson.annotation.JsonInclude;
2524
import com.fasterxml.jackson.annotation.JsonInclude.Include;
2625
import com.fasterxml.jackson.annotation.JsonUnwrapped;
@@ -80,7 +79,6 @@ public Status getStatus() {
8079
* Return the details of the health.
8180
* @return the details (or an empty map)
8281
*/
83-
@JsonAnyGetter
8482
public Map<String, Object> getDetails() {
8583
return this.details;
8684
}

Diff for: spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/HealthEndpointWebIntegrationTests.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ public class HealthEndpointWebIntegrationTests {
4949
@Test
5050
public void whenHealthIsUp200ResponseIsReturned() throws Exception {
5151
client.get().uri("/application/health").exchange().expectStatus().isOk()
52-
.expectBody().jsonPath("status").isEqualTo("UP").jsonPath("alpha.status")
53-
.isEqualTo("UP").jsonPath("bravo.status").isEqualTo("UP");
52+
.expectBody().jsonPath("status").isEqualTo("UP")
53+
.jsonPath("details.alpha.status").isEqualTo("UP")
54+
.jsonPath("details.bravo.status").isEqualTo("UP");
5455
}
5556

5657
@Test
@@ -59,8 +60,8 @@ public void whenHealthIsDown503ResponseIsReturned() throws Exception {
5960
.setHealth(Health.down().build());
6061
client.get().uri("/application/health").exchange().expectStatus()
6162
.isEqualTo(HttpStatus.SERVICE_UNAVAILABLE).expectBody().jsonPath("status")
62-
.isEqualTo("DOWN").jsonPath("alpha.status").isEqualTo("DOWN")
63-
.jsonPath("bravo.status").isEqualTo("UP");
63+
.isEqualTo("DOWN").jsonPath("details.alpha.status").isEqualTo("DOWN")
64+
.jsonPath("details.bravo.status").isEqualTo("UP");
6465
}
6566

6667
@Configuration

Diff for: spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/CompositeHealthIndicatorTests.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,11 @@ public void testSerialization() throws Exception {
120120
composite.addHealthIndicator("db", innerComposite);
121121
Health result = composite.health();
122122
ObjectMapper mapper = new ObjectMapper();
123-
assertThat(mapper.writeValueAsString(result))
124-
.isEqualTo("{\"status\":\"UNKNOWN\",\"db\":{\"status\":\"UNKNOWN\""
125-
+ ",\"db1\":{\"status\":\"UNKNOWN\",\"1\":\"1\"},"
126-
+ "\"db2\":{\"status\":\"UNKNOWN\",\"2\":\"2\"}}}");
123+
assertThat(mapper.writeValueAsString(result)).isEqualTo(
124+
"{\"status\":\"UNKNOWN\",\"details\":{\"db\":{\"status\":\"UNKNOWN\""
125+
+ ",\"details\":{\"db1\":{\"status\":\"UNKNOWN\",\"details\""
126+
+ ":{\"1\":\"1\"}},\"db2\":{\"status\":\"UNKNOWN\",\"details\""
127+
+ ":{\"2\":\"2\"}}}}}}");
127128
}
128129

129130
}

0 commit comments

Comments
 (0)