|
10 | 10 | import com.fasterxml.jackson.annotation.JsonFormat;
|
11 | 11 |
|
12 | 12 | 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; |
17 | 15 | import com.fasterxml.jackson.databind.exc.InvalidFormatException;
|
18 | 16 |
|
19 | 17 | import static org.junit.jupiter.api.Assertions.*;
|
@@ -103,6 +101,22 @@ static class Book4481 {
|
103 | 101 | public Color color;
|
104 | 102 | }
|
105 | 103 |
|
| 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 | + |
106 | 120 | /*
|
107 | 121 | /**********************************************************
|
108 | 122 | /* Test methods, basic
|
@@ -315,6 +329,38 @@ public void testEnumWithNullForUnknownValueEnumSet() throws Exception {
|
315 | 329 | assertTrue(pojo.value.contains(MyEnum2352_3.B));
|
316 | 330 | }
|
317 | 331 |
|
| 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 | + |
318 | 364 | /*
|
319 | 365 | /**********************************************************
|
320 | 366 | /* Test methods, other
|
|
0 commit comments