Skip to content

Commit e088857

Browse files
authored
Allow override DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE with JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE (#4490)
1 parent 648fde5 commit e088857

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

release-notes/VERSION-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Project: jackson-databind
2828
#4481: Unable to override `DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL`
2929
with `JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_AS_NULL`
3030
(reported by @luozhenyu)
31+
#4489: Unable to override `DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE`
32+
with `JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE`
33+
(reported by Joo-Hyuk K)
34+
(fix by Joo-Hyuk K)
3135
3236
2.17.0 (12-Mar-2024)
3337

src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,16 @@ protected boolean useNullForUnknownEnum(DeserializationContext ctxt) {
494494

495495
// @since 2.15
496496
protected boolean useDefaultValueForUnknownEnum(DeserializationContext ctxt) {
497-
return (_enumDefaultValue != null)
498-
&& (Boolean.TRUE.equals(_useDefaultValueForUnknownEnum)
499-
|| ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE));
497+
// If we have a default value...
498+
if (_enumDefaultValue != null) {
499+
// Check if FormatFeature overrides exist first
500+
if (_useDefaultValueForUnknownEnum != null) {
501+
return _useDefaultValueForUnknownEnum;
502+
}
503+
// Otherwise, check the global setting
504+
return ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
505+
}
506+
// No default value? then false
507+
return false;
500508
}
501509
}

src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumAltIdTest.java

+50-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010
import com.fasterxml.jackson.annotation.JsonFormat;
1111

1212
import com.fasterxml.jackson.core.type.TypeReference;
13-
import com.fasterxml.jackson.databind.DeserializationFeature;
14-
import com.fasterxml.jackson.databind.MapperFeature;
15-
import com.fasterxml.jackson.databind.ObjectMapper;
16-
import com.fasterxml.jackson.databind.ObjectReader;
13+
import com.fasterxml.jackson.databind.*;
14+
import com.fasterxml.jackson.databind.json.JsonMapper;
1715
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
1816

1917
import static org.junit.jupiter.api.Assertions.*;
@@ -103,6 +101,22 @@ static class Book4481 {
103101
public Color color;
104102
}
105103

104+
enum Types {
105+
@JsonEnumDefaultValue
106+
DEFAULT_TYPE,
107+
FAST, SLOW
108+
}
109+
110+
static class SpeedWithoutDefaultOverride {
111+
@JsonFormat(without = JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
112+
public Types type;
113+
}
114+
115+
static class SpeedWithDefaultOverride {
116+
@JsonFormat(with = JsonFormat.Feature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
117+
public Types type;
118+
}
119+
106120
/*
107121
/**********************************************************
108122
/* Test methods, basic
@@ -315,6 +329,38 @@ public void testEnumWithNullForUnknownValueEnumSet() throws Exception {
315329
assertTrue(pojo.value.contains(MyEnum2352_3.B));
316330
}
317331

332+
/**
333+
* Test to verify that configuration via
334+
* {@link com.fasterxml.jackson.annotation.JsonFormat.Feature#READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE}
335+
* takes precedence over global configuration.
336+
*/
337+
@Test
338+
public void testJsonEnumDefaultValueOverrideOverGlobalConfig() throws Exception {
339+
final String UNKNOWN_JSON = a2q("{'type':'OOPS!'}");
340+
341+
// First, global configuration is ENABLED and JsonFeature configuration is DISABLED
342+
// So the test should fail
343+
try {
344+
JsonMapper.builder()
345+
.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
346+
.build()
347+
.readValue(UNKNOWN_JSON, SpeedWithoutDefaultOverride.class);
348+
fail();
349+
} catch (InvalidFormatException e) {
350+
verifyException(e, "Cannot deserialize value of type");
351+
verifyException(e, "not one of the values accepted for Enum class");
352+
}
353+
354+
// Second, global configuration is DISABLED and JsonFeature configuration is ENABLED
355+
// So the test should pass
356+
SpeedWithDefaultOverride pojo = JsonMapper.builder()
357+
.disable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
358+
.build()
359+
.readValue(UNKNOWN_JSON, SpeedWithDefaultOverride.class);
360+
361+
assertEquals(Types.DEFAULT_TYPE, pojo.type);
362+
}
363+
318364
/*
319365
/**********************************************************
320366
/* Test methods, other

0 commit comments

Comments
 (0)