Skip to content

Commit 26f56ff

Browse files
authored
Use @JsonProperty over EnumNamingStrategy for Enum serializaton (#4040)
1 parent 1ae7dc4 commit 26f56ff

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,6 @@ protected static EnumValues constructEnumNamingStrategyValues(SerializationConfi
299299
EnumNamingStrategy enumNamingStrategy = EnumNamingStrategyFactory.createEnumNamingStrategyInstance(
300300
namingDef, config.canOverrideAccessModifiers());
301301
return enumNamingStrategy == null ? null : EnumValues.constructUsingEnumNamingStrategy(
302-
config, enumClass, enumNamingStrategy);
302+
config, annotatedClass, enumNamingStrategy);
303303
}
304304
}

src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java

+38
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,52 @@ public static EnumValues constructFromToString(MapperConfig<?> config, Class<Enu
156156
return construct(config, enumClass, external);
157157
}
158158

159+
/**
160+
* Returns String serializations of Enum name using an instance of {@link EnumNamingStrategy}.
161+
* <p>
162+
* The output {@link EnumValues} should contain values that are symmetric to
163+
* {@link EnumResolver#constructUsingEnumNamingStrategy(DeserializationConfig, AnnotatedClass, EnumNamingStrategy)}.
164+
*
165+
* @since 2.16
166+
*/
167+
public static EnumValues constructUsingEnumNamingStrategy(MapperConfig<?> config, AnnotatedClass annotatedClass,
168+
EnumNamingStrategy namingStrategy)
169+
{
170+
// prepare data
171+
final AnnotationIntrospector ai = config.getAnnotationIntrospector();
172+
final Class<?> enumCls0 = annotatedClass.getRawType();
173+
final Class<Enum<?>> enumCls = _enumClass(enumCls0);
174+
final Enum<?>[] enumConstants = _enumConstants(enumCls0);
175+
176+
// introspect
177+
String[] names = new String[enumConstants.length];
178+
if (ai != null) {
179+
ai.findEnumValues(config, annotatedClass, enumConstants, names);
180+
}
181+
182+
// build
183+
SerializableString[] textual = new SerializableString[enumConstants.length];
184+
for (int i = 0, len = enumConstants.length; i < len; i++) {
185+
Enum<?> enumValue = enumConstants[i];
186+
String name = names[i];
187+
if (name == null) {
188+
name = namingStrategy.convertEnumToExternalName(enumValue.name());
189+
}
190+
textual[i] = config.compileString(name);
191+
}
192+
return construct(enumCls, textual);
193+
}
194+
159195
/**
160196
* Returns String serializations of Enum name using an instance of {@link EnumNamingStrategy}.
161197
*
162198
* The output {@link EnumValues} should contain values that are symmetric to
163199
* {@link EnumResolver#constructUsingEnumNamingStrategy(DeserializationConfig, AnnotatedClass, EnumNamingStrategy)}.
164200
*
165201
* @since 2.15
202+
* @deprecated Since 2.16; use {@link #constructUsingEnumNamingStrategy(MapperConfig, AnnotatedClass, EnumNamingStrategy)} instead.
166203
*/
204+
@Deprecated
167205
public static EnumValues constructUsingEnumNamingStrategy(MapperConfig<?> config, Class<Enum<?>> enumClass, EnumNamingStrategy namingStrategy) {
168206
Class<? extends Enum<?>> cls = ClassUtil.findEnumType(enumClass);
169207
Enum<?>[] values = cls.getEnumConstants();

src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumNamingSerializationTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ static enum EnumFlavorD {
4848
PEANUT_BUTTER
4949
}
5050

51+
@EnumNaming(EnumNamingStrategies.CamelCaseStrategy.class)
52+
static enum EnumFlavorE {
53+
PEANUT_BUTTER,
54+
@JsonProperty("almond")
55+
ALMOND_BUTTER
56+
}
57+
5158
static class EnumFlavorWrapperBean {
5259
public EnumSauceB sauce;
5360

@@ -102,4 +109,12 @@ public void testDesrEnumWithEnumMap() throws Exception {
102109

103110
assertEquals(a2q("{'mayoNezz':'value'}"), str);
104111
}
112+
113+
public void testEnumNamingStrategyWithOverride() throws Exception {
114+
String almond = MAPPER.writeValueAsString(EnumFlavorE.ALMOND_BUTTER);
115+
assertEquals(q("almond"), almond);
116+
117+
String peanut = MAPPER.writeValueAsString(EnumFlavorE.PEANUT_BUTTER);
118+
assertEquals(q("peanutButter"), peanut);
119+
}
105120
}

0 commit comments

Comments
 (0)