From e6db6c58d25174feb24b9b06e3143603f42d1fcc Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 5 Aug 2021 16:33:38 +0200 Subject: [PATCH] GH-55 - Support for ValueObject marker interface in Jackson integration. We now also detect the newly introduced ValueObject marker interface when detecting value objects to support in our Jackson (de)serialization customization. See xmolecules/jmolecules#55. --- .../jmolecules/jackson/JMoleculesModule.java | 3 ++- ...leValueWrappingTypeDeserializerModifier.java | 1 + ...ngleValueWrappingTypeSerializerModifier.java | 1 + .../jackson/JMoleculesModuleUnitTests.java | 17 ++++++++++++++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/JMoleculesModule.java b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/JMoleculesModule.java index 80130a6..b96c1b3 100644 --- a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/JMoleculesModule.java +++ b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/JMoleculesModule.java @@ -22,7 +22,8 @@ import com.fasterxml.jackson.databind.module.SimpleModule; /** - * A Jackson {@link Module} to support JMolecules' {@link ValueObject} and {@link Identifier} types. + * A Jackson {@link Module} to support JMolecules' {@link ValueObject}, {@link org.jmolecules.ddd.types.ValueObject} and + * {@link Identifier} types. * * @author Oliver Drotbohm */ diff --git a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeDeserializerModifier.java b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeDeserializerModifier.java index 0a3c6fa..261e53d 100644 --- a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeDeserializerModifier.java +++ b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeDeserializerModifier.java @@ -62,6 +62,7 @@ public JsonDeserializer modifyDeserializer(DeserializationConfig config, Bean Class type = descriptor.getBeanClass(); if (DETECTOR.hasAnnotation(type, ValueObject.class) + || org.jmolecules.ddd.types.ValueObject.class.isAssignableFrom(type) || Identifier.class.isAssignableFrom(type)) { BeanPropertyDefinition definition = properties.get(0); diff --git a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeSerializerModifier.java b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeSerializerModifier.java index 7328381..2d58f6e 100644 --- a/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeSerializerModifier.java +++ b/jmolecules-jackson/src/main/java/org/jmolecules/jackson/SingleValueWrappingTypeSerializerModifier.java @@ -57,6 +57,7 @@ public JsonSerializer modifySerializer(SerializationConfig config, BeanDescri Class type = description.getBeanClass(); if (AnnotatedElementUtils.hasAnnotation(type, ValueObject.class) + || org.jmolecules.ddd.types.ValueObject.class.isAssignableFrom(type) || Identifier.class.isAssignableFrom(type)) { return new SingleAttributeSerializer(properties.get(0).getAccessor()); } diff --git a/jmolecules-jackson/src/test/java/org/jmolecules/jackson/JMoleculesModuleUnitTests.java b/jmolecules-jackson/src/test/java/org/jmolecules/jackson/JMoleculesModuleUnitTests.java index 11b058b..f2d6c53 100644 --- a/jmolecules-jackson/src/test/java/org/jmolecules/jackson/JMoleculesModuleUnitTests.java +++ b/jmolecules-jackson/src/test/java/org/jmolecules/jackson/JMoleculesModuleUnitTests.java @@ -41,13 +41,16 @@ void serialize() throws Exception { SampleIdentifier identifier = SampleIdentifier.of(UUID.randomUUID()); SampleValueObject valueObject = SampleValueObject.of(42L); + ImplementingValueObject implementingValueObject = ImplementingValueObject.of(27L); + Document source = new Document(identifier, valueObject, implementingValueObject); - String result = mapper.writeValueAsString(new Document(identifier, valueObject)); + String result = mapper.writeValueAsString(source); DocumentContext document = JsonPath.parse(result); assertThat(document.read("$.identifier", String.class)).isEqualTo(identifier.getId().toString()); assertThat(document.read("$.valueObject", Long.class)).isEqualTo(42L); + assertThat(document.read("$.implementingValueObject", Long.class)).isEqualTo(27L); } @Test // #19 @@ -56,12 +59,14 @@ void deserialize() throws Exception { String uuidSource = "fe6f3370-5551-4251-86d3-b4db049a7ddd"; UUID uuid = UUID.fromString(uuidSource); - Document document = mapper.readValue( - "{ \"identifier\" : \"" + uuidSource + "\", \"valueObject\" : 42 }", + Document document = mapper.readValue("{ \"identifier\" : \"" + uuidSource + "\"," + + " \"valueObject\" : 42," + + " \"implementingValueObject\" : 27 }", Document.class); assertThat(document.identifier).isEqualTo(SampleIdentifier.of(uuid)); assertThat(document.valueObject).isEqualTo(SampleValueObject.of(42L)); + assertThat(document.implementingValueObject).isEqualTo(ImplementingValueObject.of(27L)); } @Data @@ -70,6 +75,7 @@ void deserialize() throws Exception { static class Document { SampleIdentifier identifier; SampleValueObject valueObject; + ImplementingValueObject implementingValueObject; } @Value(staticConstructor = "of") @@ -82,4 +88,9 @@ static class SampleIdentifier implements Identifier { static class SampleValueObject { Long number; } + + @Value(staticConstructor = "of") + static class ImplementingValueObject implements org.jmolecules.ddd.types.ValueObject { + Long value; + } }