EnumSetDeserializationWithDefaultTyping4849Test.java
package tools.jackson.databind.deser.enums;
import java.util.EnumSet;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import tools.jackson.databind.DefaultTyping;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import tools.jackson.databind.jsontype.PolymorphicTypeValidator;
import tools.jackson.databind.jsontype.impl.DefaultTypeResolverBuilder;
import tools.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
import tools.jackson.databind.testutil.DatabindTestUtil;
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();
DefaultTypeResolverBuilder resolverBuilder
= new DefaultTypeResolverBuilder(validator, DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY) {
@Override
public boolean useForType(JavaType t) {
return true;
}
};
StdTypeResolverBuilder stdTypeResolverBuilder = resolverBuilder
.init(JsonTypeInfo.Value.construct(JsonTypeInfo.Id.CLASS, JsonTypeInfo.As.PROPERTY,
"", Object.class, false, null),
null);
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);
}
}