-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Closed
Labels
polymorphic-deductionIssues related to "Id.DEDUCTION" mode of `@JsonTypeInfo`Issues related to "Id.DEDUCTION" mode of `@JsonTypeInfo`
Description
Describe the bug
When an interface type is being used for an attribute and an enum implements this interface, resulting serialization and deserialization behavior is incorrect.
Version information
2.14.1
To Reproduce
If you have a way to reproduce this with:
// POJO
public class Animal {
private LivingBeingType type;
private String name;
// getters and setters
}
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({@JsonSubTypes.Type(value = AnimalType.class)})
public interface LivingBeingType {
}
public enum AnimalType implements LivingBeingType {
FOURLEGGED, TWOLEGGED
}
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
// Serialization
Animal animal = new Animal();
animal.setName("Horse");
animal.setType(AnimalType.FOURLEGGED);
System.out.println("***Serialization***");
System.out.println(objectMapper.writeValueAsString(animal));
// Deserialization
String json = "{\"type\":\"FOURLEGGED\",\"name\":\"Horse\"}";
System.out.println("***Deserialization***");
System.out.println(objectMapper.readValue(json, Animal.class));
}
Output :
***Serialization***
{"type":["com.smilep.jackson.AnimalType","FOURLEGGED"],"name":"Horse"}
***Deserialization***
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.smilep.jackson.LivingBeingType]: Unexpected input
at [Source: (String)"{"type":"FOURLEGGED","name":"Horse"}"; line: 1, column: 9] (through reference chain: com.smilep.jackson.Animal["type"])
at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43)
at com.fasterxml.jackson.databind.DeserializationContext.missingTypeIdException(DeserializationContext.java:2088)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingTypeId(DeserializationContext.java:1601)
at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._handleMissingTypeId(TypeDeserializerBase.java:307)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedUsingDefaultImpl(AsPropertyTypeDeserializer.java:185)
at com.fasterxml.jackson.databind.jsontype.impl.AsDeductionTypeDeserializer.deserializeTypedFromObject(AsDeductionTypeDeserializer.java:110)
at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:263)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4730)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3677)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3645)
at com.smilep.jackson.JacksonMain.main(JacksonMain.java:20)
Process finished with exit code 1
Expected behavior
Serialization should produce {"type":"FOURLEGGED","name":"Horse"}
Deserialization should produce Animal
instance with type
having value of AnimalType.FOURLEGGED
instance.
Metadata
Metadata
Assignees
Labels
polymorphic-deductionIssues related to "Id.DEDUCTION" mode of `@JsonTypeInfo`Issues related to "Id.DEDUCTION" mode of `@JsonTypeInfo`