diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 74044566e2..5084cb7bbb 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -25,6 +25,9 @@ Project: jackson-databind (fix by Joo-Hyuk K) #4450: Empty QName deserialized as `null` (reported by @winfriedgerlach) +#4481: Unable to override `DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL` + with `JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_AS_NULL` + (reported by @luozhenyu) 2.17.0 (12-Mar-2024) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java index 68c2be07c6..7174ae6e59 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java @@ -486,8 +486,10 @@ protected CompactStringObjectMap _getToStringLookup(DeserializationContext ctxt) // @since 2.15 protected boolean useNullForUnknownEnum(DeserializationContext ctxt) { - return Boolean.TRUE.equals(_useNullForUnknownEnum) - || ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL); + if (_useNullForUnknownEnum != null) { + return _useNullForUnknownEnum; + } + return ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL); } // @since 2.15 diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumAltIdTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumAltIdTest.java index ac302c92aa..a8cf41a006 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumAltIdTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumAltIdTest.java @@ -93,6 +93,16 @@ enum MyEnum2352_3 { C; } + // [databind#4481]: override for "unknown as null" + enum Color { + RED, BLUE + } + + static class Book4481 { + @JsonFormat(without = JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_AS_NULL) + public Color color; + } + /* /********************************************************** /* Test methods, basic @@ -304,4 +314,25 @@ public void testEnumWithNullForUnknownValueEnumSet() throws Exception { assertEquals(1, pojo.value.size()); assertTrue(pojo.value.contains(MyEnum2352_3.B)); } + + /* + /********************************************************** + /* Test methods, other + /********************************************************** + */ + + // [databind#4481] + @Test + public void testDefaultFromNullOverride4481() throws Exception + { + try { + Book4481 book = MAPPER.readerFor(Book4481.class) + .with(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL) + .readValue("{\"color\":\"WHITE\"}"); + fail("Should have failed; got: "+book.color); + } catch (InvalidFormatException e) { + verifyException(e, "Cannot deserialize value of type "); + verifyException(e, "not one of the values accepted for Enum class"); + } + } }