From 77e4eb7f922153e0677033227e281e8e7de48d5f Mon Sep 17 00:00:00 2001 From: Cosimo Damiano Prete Date: Mon, 13 Jul 2026 13:32:05 +0200 Subject: [PATCH] fix(#5525): Make StatusInfo payload respect the sorting coming from the health payload for the provided details --- .../server/domain/values/StatusInfo.java | 4 ++-- .../server/domain/values/StatusInfoTest.java | 23 +++++++++++++++---- .../admin/server/notify/MailNotifierTest.java | 6 ++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/domain/values/StatusInfo.java b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/domain/values/StatusInfo.java index 7da5d2caa58..f1cbf8b89c9 100644 --- a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/domain/values/StatusInfo.java +++ b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/domain/values/StatusInfo.java @@ -19,7 +19,7 @@ import java.io.Serializable; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -58,7 +58,7 @@ public final class StatusInfo implements Serializable { private StatusInfo(String status, @Nullable Map details) { Assert.hasText(status, "'status' must not be empty."); this.status = status.toUpperCase(); - this.details = (details != null) ? new HashMap<>(details) : Collections.emptyMap(); + this.details = (details != null && !details.isEmpty()) ? new LinkedHashMap<>(details) : Collections.emptyMap(); } public static StatusInfo valueOf(String statusCode, @Nullable Map details) { diff --git a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/domain/values/StatusInfoTest.java b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/domain/values/StatusInfoTest.java index 6c3d53b3509..464254b8a45 100644 --- a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/domain/values/StatusInfoTest.java +++ b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/domain/values/StatusInfoTest.java @@ -17,10 +17,13 @@ package de.codecentric.boot.admin.server.domain.values; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static de.codecentric.boot.admin.server.domain.values.StatusInfo.STATUS_DOWN; import static de.codecentric.boot.admin.server.domain.values.StatusInfo.STATUS_OFFLINE; @@ -117,13 +120,25 @@ void factory_methods_with_details() { assertThat(restricted.isRestricted()).isTrue(); } - @Test - void when_first_level_key_is_components() { + @ParameterizedTest + @ValueSource(strings = { "components", "details" }) + void when_first_level_key_expected_nested_details(String key) { + Map details = singletonMap("foo", "bar"); Map map = new HashMap<>(); map.put("status", "UP"); - map.put("components", singletonMap("foo", "bar")); + map.put(key, details); - assertThat(StatusInfo.from(map)).isEqualTo(StatusInfo.ofUp(singletonMap("foo", "bar"))); + assertThat(StatusInfo.from(map)).isEqualTo(StatusInfo.ofUp(details)); + } + + @Test + void should_preserve_details_order() { + Map details = new LinkedHashMap<>(); + details.put("a", "x"); + details.put("c", "z"); + details.put("b", "y"); + + assertThat(StatusInfo.valueOf("UP", details).getDetails()).isEqualTo(details); } @Test diff --git a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/notify/MailNotifierTest.java b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/notify/MailNotifierTest.java index d36621d233f..259de3e17d8 100644 --- a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/notify/MailNotifierTest.java +++ b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/notify/MailNotifierTest.java @@ -19,7 +19,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; @@ -93,9 +93,9 @@ void setup() { @Test void should_send_mail_using_default_template() throws IOException, MessagingException { - Map details = new HashMap<>(); - details.put("Simple Value", 1234); + Map details = new LinkedHashMap<>(); details.put("Complex Value", singletonMap("Nested Simple Value", "99!")); + details.put("Simple Value", 1234); StepVerifier.create(notifier.notify( new InstanceStatusChangedEvent(instance.getId(), instance.getVersion(), StatusInfo.ofDown(details))))