From 82fc8cf8fcc2e0dfc2ed29488ec3522d81bfee39 Mon Sep 17 00:00:00 2001 From: Sunil Mogadati Date: Sun, 8 Jan 2017 07:13:39 -0700 Subject: [PATCH] BAEL-245: Add Enum serialization example (#970) * Add NDC and JBoss Logging to the demo application * NDC for Log4j, Log4j2 and JBoss Logging * Simplify NDC example by making it a single operation instead of two * Make NDC example as RestController, Use JBoss Logging only as a logging bridge * Fix merge conflicts in pull request - log-mdc pom.xml updated * BAEL-445 Update to Spring security SpEL example * BAEL-445: Change tabs to spaces in the updated code * BAEL-245: Add Enum Serialization exmaple * BAEL-245: Remove the folder jackson/src/test/java/com/baeldung/jackson/dtos/withEnum as the example is not used anymore --- .../com/baeldung/jackson/enums/Distance.java | 54 ++++++++++++++++++ .../serialization/DistanceSerializer.java | 33 +++++++++++ .../jackson/dtos/withEnum/MyDtoWithEnum.java | 57 ------------------- .../dtos/withEnum/MyDtoWithEnumCustom.java | 57 ------------------- .../jackson/dtos/withEnum/TypeEnum.java | 35 ------------ .../jackson/dtos/withEnum/TypeEnumSimple.java | 32 ----------- .../TypeEnumWithCustomSerializer.java | 35 ------------ .../dtos/withEnum/TypeEnumWithValue.java | 36 ------------ .../jackson/dtos/withEnum/TypeSerializer.java | 32 ----------- .../enums/JacksonEnumSerializationTest.java | 22 +++++++ 10 files changed, 109 insertions(+), 284 deletions(-) create mode 100644 jackson/src/main/java/com/baeldung/jackson/enums/Distance.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java diff --git a/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java b/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java new file mode 100644 index 0000000000..8026eedc44 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java @@ -0,0 +1,54 @@ +package com.baeldung.jackson.enums; + +import com.baeldung.jackson.serialization.DistanceSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +/** + * Use @JsonFormat to handle representation of Enum as JSON (available since Jackson 2.1.2) + * Use @JsonSerialize to configure a custom Jackson serializer + */ +// @JsonFormat(shape = JsonFormat.Shape.OBJECT) +@JsonSerialize(using = DistanceSerializer.class) +public enum Distance { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + /** + * Use @JsonValue to control marshalling output for an enum + */ + // @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + /** + * Usage example: Distance.MILE.convertFromMeters(1205.5); + */ + public double convertFromMeters(double distanceInMeters) { + return distanceInMeters / meters; + + } + + /** + * Usage example: Distance.MILE.convertToMeters(0.5); + */ + public double convertToMeters(double distanceInMeters) { + return distanceInMeters * meters; + } + +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java b/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java new file mode 100644 index 0000000000..ca013ff921 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java @@ -0,0 +1,33 @@ +package com.baeldung.jackson.serialization; + +import java.io.IOException; + +import com.baeldung.jackson.enums.Distance; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class DistanceSerializer extends StdSerializer { + + private static final long serialVersionUID = 1376504304439963619L; + + public DistanceSerializer() { + super(Distance.class); + } + + public DistanceSerializer(Class t) { + super(t); + } + + public void serialize(Distance distance, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { + generator.writeStartObject(); + generator.writeFieldName("name"); + generator.writeNumber(distance.name()); + generator.writeFieldName("unit"); + generator.writeString(distance.getUnit()); + generator.writeFieldName("meters"); + generator.writeNumber(distance.getMeters()); + generator.writeEndObject(); + } +} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java deleted file mode 100644 index 258eb6febd..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public class MyDtoWithEnum { - - private String stringValue; - private int intValue; - private boolean booleanValue; - private TypeEnum type; - - public MyDtoWithEnum() { - super(); - } - - public MyDtoWithEnum(final String stringValue, final int intValue, final boolean booleanValue, final TypeEnum type) { - super(); - - this.stringValue = stringValue; - this.intValue = intValue; - this.booleanValue = booleanValue; - this.type = type; - } - - // API - - public String getStringValue() { - return stringValue; - } - - public void setStringValue(final String stringValue) { - this.stringValue = stringValue; - } - - public int getIntValue() { - return intValue; - } - - public void setIntValue(final int intValue) { - this.intValue = intValue; - } - - public boolean isBooleanValue() { - return booleanValue; - } - - public void setBooleanValue(final boolean booleanValue) { - this.booleanValue = booleanValue; - } - - public TypeEnum getType() { - return type; - } - - public void setType(final TypeEnum type) { - this.type = type; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java deleted file mode 100644 index 676e22686e..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public class MyDtoWithEnumCustom { - - private String stringValue; - private int intValue; - private boolean booleanValue; - private TypeEnumWithCustomSerializer type; - - public MyDtoWithEnumCustom() { - super(); - } - - public MyDtoWithEnumCustom(final String stringValue, final int intValue, final boolean booleanValue, final TypeEnumWithCustomSerializer type) { - super(); - - this.stringValue = stringValue; - this.intValue = intValue; - this.booleanValue = booleanValue; - this.type = type; - } - - // API - - public String getStringValue() { - return stringValue; - } - - public void setStringValue(final String stringValue) { - this.stringValue = stringValue; - } - - public int getIntValue() { - return intValue; - } - - public void setIntValue(final int intValue) { - this.intValue = intValue; - } - - public boolean isBooleanValue() { - return booleanValue; - } - - public void setBooleanValue(final boolean booleanValue) { - this.booleanValue = booleanValue; - } - - public TypeEnumWithCustomSerializer getType() { - return type; - } - - public void setType(final TypeEnumWithCustomSerializer type) { - this.type = type; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java deleted file mode 100644 index e0c9718330..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.annotation.JsonFormat; - -@JsonFormat(shape = JsonFormat.Shape.OBJECT) -public enum TypeEnum { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnum(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java deleted file mode 100644 index 477db67069..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public enum TypeEnumSimple { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnumSimple(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java deleted file mode 100644 index e7c2859dd1..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -@JsonSerialize(using = TypeSerializer.class) -public enum TypeEnumWithCustomSerializer { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnumWithCustomSerializer(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java deleted file mode 100644 index c5ddf222ff..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TypeEnumWithValue { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - - private String name; - - private TypeEnumWithValue(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - @JsonValue - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java deleted file mode 100644 index fc5011137c..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import java.io.IOException; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -public class TypeSerializer extends StdSerializer { - - private static final long serialVersionUID = -7650668914169390772L; - - public TypeSerializer() { - this(null); - } - - public TypeSerializer(final Class t) { - super(t); - } - - @Override - public void serialize(final TypeEnumWithCustomSerializer value, final JsonGenerator generator, final SerializerProvider provider) throws IOException, JsonProcessingException { - generator.writeStartObject(); - generator.writeFieldName("id"); - generator.writeNumber(value.getId()); - generator.writeFieldName("name"); - generator.writeString(value.getName()); - generator.writeEndObject(); - } - -} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java new file mode 100644 index 0000000000..af61e55bb4 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.jackson.enums; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonEnumSerializationTest { + + @Test + public final void givenEnum_whenSerializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + final String dtoAsString = new ObjectMapper().writeValueAsString(Distance.MILE); + + assertThat(dtoAsString, containsString("1609.34")); + } + +}