Skip to content

Commit 464ca20

Browse files
authored
Merge pull request #2 from connorbo97/override-read-unknowns-config
add flag to SerializationConfig to disable READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE config
2 parents 8eba69b + 00832eb commit 464ca20

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

src/main/java/com/taboola/rest/api/internal/config/SerializationConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
public class SerializationConfig {
77
private Map<Class<?>, Class<?>> mixins;
88
private boolean shouldIgnoreAnySetterAnnotation;
9+
private boolean shouldDisableReadUnknownEnumValuesAsDefaultValue;
910

1011
public SerializationConfig() {
1112
mixins = new HashMap<>();
1213
shouldIgnoreAnySetterAnnotation = false;
14+
shouldDisableReadUnknownEnumValuesAsDefaultValue = false;
1315
}
1416

1517
public SerializationConfig setMixins(Map<Class<?>, Class<?>> mixins) {
@@ -22,13 +24,21 @@ public SerializationConfig setShouldIgnoreAnySetterAnnotation() {
2224
return this;
2325
}
2426

27+
public SerializationConfig setShouldDisableReadUnknownEnumValuesAsDefaultValue() {
28+
this.shouldDisableReadUnknownEnumValuesAsDefaultValue = true;
29+
return this;
30+
}
31+
2532
public Map<Class<?>, Class<?>> getMixins() {
2633
return mixins;
2734
}
2835

2936
public boolean shouldIgnoreAnySetterAnnotation() {
3037
return shouldIgnoreAnySetterAnnotation;
3138
}
39+
public boolean shouldDisableReadUnknownEnumValuesAsDefaultValue() {
40+
return shouldDisableReadUnknownEnumValuesAsDefaultValue;
41+
}
3242

3343
@Override
3444
public String toString() {

src/main/java/com/taboola/rest/api/internal/serialization/SerializationMapperCreator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ public static ObjectMapper createObjectMapper(SerializationConfig serializationC
1212
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
1313
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
1414
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
15-
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true);
15+
16+
if (!serializationConfig.shouldDisableReadUnknownEnumValuesAsDefaultValue()) {
17+
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true);
18+
}
19+
1620
serializationConfig.getMixins().forEach(objectMapper::addMixIn);
1721

1822
if (serializationConfig.shouldIgnoreAnySetterAnnotation()) {

src/test/java/com/taboola/rest/api/internal/serialization/SerializationMapperCreatorTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.taboola.rest.api.internal.serialization;
22

33
import com.fasterxml.jackson.annotation.JsonAnySetter;
4+
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
45
import com.fasterxml.jackson.annotation.JsonIgnore;
56
import com.fasterxml.jackson.annotation.JsonProperty;
67
import com.fasterxml.jackson.databind.ObjectMapper;
78
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
9+
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
810
import com.taboola.rest.api.internal.config.SerializationConfig;
911

1012
import org.junit.Assert;
@@ -68,17 +70,82 @@ public void createObjectMapper_serializationConfigWithIgnoreAnySetterAndApiObjec
6870
Assert.assertNull("Name is parsed incorrectly", sampleApi.name);
6971
}
7072

73+
@Test
74+
public void createObjectMapper_defaultSerializationConfigAndApiObjectHasValidEnum_enumParsedCorrectly() throws IOException {
75+
SerializationConfig serializationConfig = new SerializationConfig();
76+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
77+
78+
SampleApi sampleApi = objectMapper.readValue("{ \"letter\": \"B\" }", SampleApi.class);
79+
80+
Assert.assertEquals("Unknown enum is parsed incorrectly", SampleEnum.B, sampleApi.letter);
81+
}
82+
83+
@Test
84+
public void createObjectMapper_defaultSerializationConfigAndApiObjectHasInvalidEnum_defaultValueUsedOnSerialization() throws IOException {
85+
SerializationConfig serializationConfig = new SerializationConfig();
86+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
87+
88+
SampleApi sampleApi = objectMapper.readValue("{ \"letter\": \"D\" }", SampleApi.class);
89+
90+
Assert.assertEquals("Unknown enum is parsed incorrectly", SampleEnum.UNKNOWN, sampleApi.letter);
91+
}
92+
93+
@Test
94+
public void createObjectMapper_defaultSerializationConfigAndApiObjectHasEmptyEnumValue_defaultValueUsedOnSerialization() throws IOException {
95+
SerializationConfig serializationConfig = new SerializationConfig();
96+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
97+
98+
SampleApi sampleApi = objectMapper.readValue("{ \"letter\": \"D\" }", SampleApi.class);
99+
100+
Assert.assertEquals("Unknown enum is parsed incorrectly", SampleEnum.UNKNOWN, sampleApi.letter);
101+
}
102+
103+
@Test
104+
public void createObjectMapper_serializationConfigWithReadUnknownEnumsDisabledAndApiObjectHasValidEnum_enumParsedCorrectly() throws IOException {
105+
SerializationConfig serializationConfig = new SerializationConfig().setShouldDisableReadUnknownEnumValuesAsDefaultValue();
106+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
107+
108+
SampleApi sampleApi = objectMapper.readValue("{ \"letter\": \"B\" }", SampleApi.class);
109+
110+
Assert.assertEquals("Unknown enum is parsed incorrectly", SampleEnum.B, sampleApi.letter);
111+
}
112+
113+
@Test(expected = InvalidFormatException.class)
114+
public void createObjectMapper_serializationConfigWithReadUnknownEnumsDisabledAndApiObjectHasInvalidEnum_InvalidFormatExceptionIsThrown() throws IOException {
115+
SerializationConfig serializationConfig = new SerializationConfig().setShouldDisableReadUnknownEnumValuesAsDefaultValue();
116+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
117+
118+
objectMapper.readValue("{ \"letter\": \"D\" }", SampleApi.class);
119+
}
120+
121+
@Test(expected = InvalidFormatException.class)
122+
public void createObjectMapper_serializationConfigWithReadUnknownEnumsDisabledAndApiObjectHasEmptyEnumValue_InvalidFormatExceptionIsThrown() throws IOException {
123+
SerializationConfig serializationConfig = new SerializationConfig().setShouldDisableReadUnknownEnumValuesAsDefaultValue();
124+
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
125+
126+
objectMapper.readValue("{ \"letter\": \"\" }", SampleApi.class);
127+
}
128+
129+
private enum SampleEnum {
130+
A, B, @JsonEnumDefaultValue UNKNOWN
131+
}
132+
71133
private static class SampleApi {
72134
@JsonProperty("id")
73135
int id;
74136

137+
@JsonProperty("letter")
138+
SampleEnum letter;
139+
75140
@JsonProperty("name")
76141
String name;
77142

78143
@JsonAnySetter
79144
public void handlerUnknownSetter(String field, Object value) throws Exception {
80145
throw new Exception("unknown field");
81146
}
147+
148+
82149
}
83150

84151
private abstract class SampleMixIn {

0 commit comments

Comments
 (0)