diff --git a/src/main/java/com/cosium/hal_model2/HalFormsBodyDeserializer.java b/src/main/java/com/cosium/hal_model2/HalFormsBodyDeserializer.java index aa5fe59..2a2fa33 100644 --- a/src/main/java/com/cosium/hal_model2/HalFormsBodyDeserializer.java +++ b/src/main/java/com/cosium/hal_model2/HalFormsBodyDeserializer.java @@ -49,11 +49,7 @@ public HalFormsBody deserialize( jsonParser, HalFormsBody.class, "Expected object node, got " + treeNode); } - Object representation = - deserializationContext.readValue( - createJsonParser(deserializationContext, objectNode), representationType); - - JsonNode links = objectNode.get("_links"); + JsonNode links = objectNode.remove("_links"); Map linkByName; if (links == null) { linkByName = Map.of(); @@ -67,7 +63,7 @@ public HalFormsBody deserialize( createJsonParser(deserializationContext, links), mapType); } - JsonNode templates = objectNode.get("_templates"); + JsonNode templates = objectNode.remove("_templates"); Map templateByKey; if (templates == null) { templateByKey = Map.of(); @@ -81,6 +77,10 @@ public HalFormsBody deserialize( createJsonParser(deserializationContext, templates), mapType); } + Object representation = + deserializationContext.readValue( + createJsonParser(deserializationContext, objectNode), representationType); + return new HalFormsBody<>(representation, linkByName, templateByKey); } diff --git a/src/test/java/com/cosium/hal_model2/HalFormsBodyTest.java b/src/test/java/com/cosium/hal_model2/HalFormsBodyTest.java index 42c8c48..d14aee9 100644 --- a/src/test/java/com/cosium/hal_model2/HalFormsBodyTest.java +++ b/src/test/java/com/cosium/hal_model2/HalFormsBodyTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Map; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -108,6 +109,37 @@ void test2() { assertThat(property.type()).isEqualTo("text"); } + @Test + @DisplayName("The body's representation excludes HAL metadata") + void test3() { + String json = + JSON.std + .composeString() + .startObject() + .startObjectProperty("_links") + .startObjectProperty("self") + .put("href", "http://localhost/form-test:put") + .end() + .end() + .startObjectProperty("_templates") + .startObjectProperty("default") + .put("method", "PUT") + .startArrayProperty("properties") + .startObject() + .put("name", "foo") + .end() + .end() + .end() + .end() + .end() + .finish(); + + HalFormsBody> halFormsBody = + TestJsonMapper.INSTANCE.readValue(json, new TypeReference<>() {}); + + assertThat(halFormsBody.representation()).isEmpty(); + } + private record User(@JsonProperty("username") String username) {} private record ContentList(@JsonProperty("content") @Nullable List content) {}