Skip to content

Commit 8af03c1

Browse files
committed
Fix #2663
1 parent a1dfaa7 commit 8af03c1

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

release-notes/VERSION-2.x

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ Project: jackson-databind
4747
#2643: Change default textual serialization of `java.util.Date`/`Calendar`
4848
to include colon in timezone offset
4949
#2647: Add `ObjectMapper.createParser()` and `createGenerator()` methods
50+
#2663: Add new factory method for creating custom `EnumValues` to pass to `EnumDeserializer
51+
(requested by Rafal K)
5052
- Add `SerializerProvider.findContentValueSerializer()` methods
5153

5254
2.10.4 (not yet released)

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

+31-10
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import com.fasterxml.jackson.databind.cfg.MapperConfig;
88

99
/**
10-
* Helper class used for storing String serializations of
11-
* enumerations.
10+
* Helper class used for storing String serializations of {@code Enum}s,
11+
* to match to/from external representations.
1212
*/
1313
public final class EnumValues
1414
implements java.io.Serializable
@@ -58,23 +58,44 @@ public static EnumValues constructFromName(MapperConfig<?> config, Class<Enum<?>
5858
}
5959
textual[en.ordinal()] = config.compileString(name);
6060
}
61-
return new EnumValues(enumClass, textual);
61+
return construct(enumClass, textual);
6262
}
6363

6464
public static EnumValues constructFromToString(MapperConfig<?> config, Class<Enum<?>> enumClass)
6565
{
6666
Class<? extends Enum<?>> cls = ClassUtil.findEnumType(enumClass);
6767
Enum<?>[] values = cls.getEnumConstants();
68-
if (values != null) {
69-
SerializableString[] textual = new SerializableString[values.length];
70-
for (Enum<?> en : values) {
71-
textual[en.ordinal()] = config.compileString(en.toString());
72-
}
73-
return new EnumValues(enumClass, textual);
68+
if (values == null) { // can this ever occur?
69+
throw new IllegalArgumentException("Cannot determine enum constants for Class "+enumClass.getName());
70+
}
71+
ArrayList<String> external = new ArrayList<>(values.length);
72+
for (Enum<?> en : values) {
73+
external.add(en.toString());
7474
}
75-
throw new IllegalArgumentException("Cannot determine enum constants for Class "+enumClass.getName());
75+
return construct(config, enumClass, external);
7676
}
7777

78+
/**
79+
* @since 2.11
80+
*/
81+
public static EnumValues construct(MapperConfig<?> config, Class<Enum<?>> enumClass,
82+
List<String> externalValues) {
83+
final int len = externalValues.size();
84+
SerializableString[] textual = new SerializableString[len];
85+
for (int i = 0; i < len; ++i) {
86+
textual[i] = config.compileString(externalValues.get(i));
87+
}
88+
return construct(enumClass, textual);
89+
}
90+
91+
/**
92+
* @since 2.11
93+
*/
94+
public static EnumValues construct(Class<Enum<?>> enumClass,
95+
SerializableString[] externalValues) {
96+
return new EnumValues(enumClass, externalValues);
97+
}
98+
7899
public SerializableString serializedValueFor(Enum<?> key) {
79100
return _textual[key.ordinal()];
80101
}

0 commit comments

Comments
 (0)