From 32190288371ed1ef167ba3c85bbb2f91a9510fa3 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 20 Apr 2021 12:47:01 +0200 Subject: [PATCH] #1515 - Fix key rendering of embedded resources. We now also eagerly map the keys for the _embedded map in a HAL response to Strings to make sure they work properly when sorting of map keys is activated for the Jackson ObjectMapper. --- .../hateoas/mediatype/hal/Jackson2HalModule.java | 7 ++++++- .../mediatype/hal/Jackson2HalIntegrationTest.java | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java b/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java index 65452791..1374fd86 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java +++ b/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -335,7 +336,11 @@ public class Jackson2HalModule extends SimpleModule { } } - provider.findValueSerializer(Map.class, property).serialize(embeddeds, jgen, provider); + Map map = new LinkedHashMap<>(embeddeds.size()); + embeddeds.forEach((key, it) -> map.put(key.value(), it)); + + provider.findValueSerializer(Map.class, property) // + .serialize(map, jgen, provider); } /* diff --git a/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java b/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java index 62ef05fd..3073b630 100755 --- a/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java @@ -643,6 +643,15 @@ class Jackson2HalIntegrationTest { .writeValueAsString(new RepresentationModel<>().add(Link.of("/href"))); } + @Test // #1515, #1517 + void rendersEmbeddedKeysWhenMapEntrySortingIsEnabled() throws Exception { + + List embbededs = Arrays.asList(new SimplePojo(), new SimpleAnnotatedPojo()); + + mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS) + .writeValueAsString(CollectionModel.of(embbededs)); + } + @Relation(collectionRelation = "someSample") static class SomeSample { @JsonProperty String name;