Skip to content

Commit 83e0bd8

Browse files
authored
Make PropertyNamingStrategy not affect Enums (#4414)
1 parent 8c70c4b commit 83e0bd8

File tree

5 files changed

+77
-5
lines changed

5 files changed

+77
-5
lines changed

release-notes/CREDITS-2.x

+6-1
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,11 @@ Jan Pachol (janpacho@github)
17301730
(2.16.0)
17311731

17321732
Pieter Dirk Soels (Badbond@github)
1733-
* Reprted #4302: Problem deserializing some type of Enums when using
1733+
* Reported #4302: Problem deserializing some type of Enums when using
17341734
`PropertyNamingStrategy`
17351735
(2.16.2)
1736+
1737+
Stephane Bailliez (sbailliez@github)
1738+
* Reported #4409: Deserialization of enums with name defined with different cases
1739+
leads to `InvalidDefinitionException`: Multiple fields representing property
1740+
(2.16.2)

release-notes/VERSION-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ Project: jackson-databind
2222
#4355: Jackson 2.16 fails attempting to obtain `ObjectWriter` for an `Enum` of which
2323
some value returns null from `toString()`
2424
(reported by @YutaHiguchi-bsn)
25+
#4409: Deserialization of enums with name defined with different cases leads to
26+
`InvalidDefinitionException`: Multiple fields representing property
27+
(reported by Stephane B)
28+
(fix contributed by Joo-Hyuk K)
2529
2630
2.16.1 (24-Dec-2023)
2731

src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java

+28
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.annotation.JacksonInject;
77
import com.fasterxml.jackson.annotation.JsonCreator;
88

9+
import com.fasterxml.jackson.annotation.JsonFormat;
910
import com.fasterxml.jackson.databind.*;
1011
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
1112
import com.fasterxml.jackson.databind.cfg.MapperConfig;
@@ -1123,6 +1124,10 @@ protected void _renameProperties(Map<String, POJOPropertyBuilder> props)
11231124
protected void _renameUsing(Map<String, POJOPropertyBuilder> propMap,
11241125
PropertyNamingStrategy naming)
11251126
{
1127+
// [databind#4409]: Need to skip renaming for Enums, unless Enums are handled as OBJECT format
1128+
if (_type.isEnumType() && (_findFormatShape() != JsonFormat.Shape.OBJECT)) {
1129+
return;
1130+
}
11261131
POJOPropertyBuilder[] props = propMap.values().toArray(new POJOPropertyBuilder[propMap.size()]);
11271132
propMap.clear();
11281133
for (POJOPropertyBuilder prop : props) {
@@ -1171,6 +1176,29 @@ protected void _renameUsing(Map<String, POJOPropertyBuilder> propMap,
11711176
}
11721177
}
11731178

1179+
/**
1180+
* Helper method called to check if given property should be renamed using {@link PropertyNamingStrategies}.
1181+
*<p>
1182+
* NOTE: copied+simplified version of {@code BasicBeanDescription.findExpectedFormat()}.
1183+
*
1184+
* @since 2.16.2
1185+
*/
1186+
private JsonFormat.Shape _findFormatShape()
1187+
{
1188+
JsonFormat.Shape shape = null;
1189+
JsonFormat.Value format = _annotationIntrospector.findFormat(_classDef);
1190+
if (format != null) {
1191+
shape = format.getShape();
1192+
}
1193+
JsonFormat.Value defFormat = _config.getDefaultPropertyFormat(_classDef.getRawType());
1194+
if (defFormat != null) {
1195+
if (shape == null) {
1196+
shape = defFormat.getShape();
1197+
}
1198+
}
1199+
return shape;
1200+
}
1201+
11741202
protected void _renameWithWrappers(Map<String, POJOPropertyBuilder> props)
11751203
{
11761204
// 11-Sep-2012, tatu: To support 'MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME',

src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import java.util.*;
44
import java.util.stream.Collectors;
55

6-
import com.fasterxml.jackson.annotation.JsonInclude;
7-
import com.fasterxml.jackson.annotation.JsonProperty;
8-
import com.fasterxml.jackson.annotation.JsonSetter;
9-
import com.fasterxml.jackson.annotation.Nulls;
6+
import com.fasterxml.jackson.annotation.*;
107

118
import com.fasterxml.jackson.databind.*;
129
import com.fasterxml.jackson.databind.cfg.ConfigOverride;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.fasterxml.jackson.databind.deser.enums;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.databind.DeserializationFeature;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder;
12+
13+
// [databind#4409]: PropertyNamingStrategy should not affect to Enums
14+
class EnumWithNamingStrategy4409Test {
15+
16+
enum ColorMode {
17+
RGB,
18+
RGBa,
19+
RGBA
20+
}
21+
22+
static class Bug {
23+
public ColorMode colorMode;
24+
}
25+
26+
@Test
27+
public void testEnumAndPropertyNamingStrategy() throws Exception {
28+
ObjectMapper mapper = jsonMapperBuilder()
29+
.propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
30+
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
31+
.build();
32+
33+
Bug bug = mapper.readValue("{ \"color_mode\": \"RGBa\"}", Bug.class);
34+
35+
// fails
36+
assertEquals(ColorMode.RGBa, bug.colorMode);
37+
}
38+
}

0 commit comments

Comments
 (0)