diff --git a/src/main/java/com/fasterxml/jackson/databind/util/EnumResolver.java b/src/main/java/com/fasterxml/jackson/databind/util/EnumResolver.java index c546b18fff..c9ac5083bf 100644 --- a/src/main/java/com/fasterxml/jackson/databind/util/EnumResolver.java +++ b/src/main/java/com/fasterxml/jackson/databind/util/EnumResolver.java @@ -176,8 +176,10 @@ public static EnumResolver constructUsingToString(DeserializationConfig config, final Enum[] enumConstants = _enumConstants(enumCls0); // introspect + final String[] names = new String[enumConstants.length]; final String[][] allAliases = new String[enumConstants.length][]; if (ai != null) { + ai.findEnumValues(config, annotatedClass, enumConstants, names); ai.findEnumAliases(config, annotatedClass, enumConstants, allAliases); } @@ -186,7 +188,11 @@ public static EnumResolver constructUsingToString(DeserializationConfig config, HashMap> map = new HashMap>(); for (int i = enumConstants.length; --i >= 0; ) { Enum enumValue = enumConstants[i]; - map.put(enumValue.toString(), enumValue); + String name = names[i]; + if (name == null) { + name = enumValue.toString(); + } + map.put(name, enumValue); String[] aliases = allAliases[i]; if (aliases != null) { for (String alias : aliases) { diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumDeserializationTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumDeserializationTest.java index 61cc7e53df..9193ae3c67 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumDeserializationTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumDeserializationTest.java @@ -89,7 +89,10 @@ static enum EnumWithPropertyAnno { public String toString() { return "bb"; } - } + }, + + @JsonProperty("cc") + C ; } @@ -539,6 +542,29 @@ public void testEnumWithJsonPropertyRename() throws Exception assertSame(EnumWithPropertyAnno.B, result[0]); assertSame(EnumWithPropertyAnno.A, result[1]); } + + public void testEnumWithJsonPropertyRenameWithToString() throws Exception { + EnumWithPropertyAnno a = MAPPER.readerFor(EnumWithPropertyAnno.class) + .with(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .readValue(q("a")); + assertSame(EnumWithPropertyAnno.A, a); + + EnumWithPropertyAnno b = MAPPER.readerFor(EnumWithPropertyAnno.class) + .with(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .readValue(q("b")); + assertSame(EnumWithPropertyAnno.B, b); + + EnumWithPropertyAnno bb = MAPPER.readerFor(EnumWithPropertyAnno.class) + .with(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .with(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL) + .readValue(q("bb")); + assertNull(bb); + + EnumWithPropertyAnno c = MAPPER.readerFor(EnumWithPropertyAnno.class) + .with(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .readValue(q("cc")); + assertSame(EnumWithPropertyAnno.C, c); + } /** * {@link #testEnumWithJsonPropertyRename()}