EnumSetDeserializationWithDefaultTyping4849Test.java
package com.fasterxml.jackson.databind.deser.enums;
import java.util.EnumSet;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY;
import static com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping.NON_FINAL;
import static org.junit.jupiter.api.Assertions.assertEquals;
// [databind#4849] Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1
public class EnumSetDeserializationWithDefaultTyping4849Test
extends DatabindTestUtil
{
enum TestEnum4849 {
TEST_ENUM_VALUE
}
private final ObjectMapper MAPPER = configureMapper4849();
private ObjectMapper configureMapper4849()
{
final PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
.allowIfSubType("com.fasterxml.jackson")
.allowIfSubType("java")
.build();
@SuppressWarnings("serial")
ObjectMapper.DefaultTypeResolverBuilder resolverBuilder
= new ObjectMapper.DefaultTypeResolverBuilder(NON_FINAL, validator) {
@Override
public boolean useForType(JavaType t) {
return true;
}
};
StdTypeResolverBuilder stdTypeResolverBuilder = resolverBuilder
.init(JsonTypeInfo.Id.CLASS, null)
.inclusion(PROPERTY);
return jsonMapperBuilder()
.setDefaultTyping(stdTypeResolverBuilder)
.build();
}
@Test
public void testSerializationDeserializationRoundTrip4849()
throws Exception
{
// Given
EnumSet<TestEnum4849> input = EnumSet.of(TestEnum4849.TEST_ENUM_VALUE);
// When : Serialize and deserialize
String inputJson = MAPPER.writeValueAsString(input);
Object inputDeserialized = MAPPER.readValue(inputJson, Object.class);
// Then
assertEquals(input, inputDeserialized);
}
@Test
public void testHardCodedDeserializationFromPreviousJackson4849()
throws Exception
{
// Given : Hard-coded output from Jackson 2.15.4
String input = String.format("[\"java.util.EnumSet<%s>\",[\"%s\"]]",
TestEnum4849.class.getName(),
TestEnum4849.TEST_ENUM_VALUE.name());
// When
Object deserialized = MAPPER.readValue(input, Object.class);
// Then
assertEquals(EnumSet.of(TestEnum4849.TEST_ENUM_VALUE), deserialized);
}
}