Uso la versión 2.2.2 de swagger-codegen-maven-plugin para generar clases de Java para una API REST. La API usa polimorfismo y Swagger proporciona las anotaciones correspondientes:
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true ) @JsonSubTypes({ @Type(value = Cat.class, name = "Cat"), @Type(value = Dog.class, name = "Dog") }) public class Pet{ @JsonProperty("type") private String type = null; // getter and setters } Ahora uso un ObjectMapper de Jackson para analizar la cadena JSON entrante. Uso el Jackson que viene con 1.5.2.RELEASE de spring-boot-starter-parent :
ObjectMapper mapper = new ObjectMapper(); String body = "{ \"pet\": { \"type\": \"Dog\" } }"; Content content = mapper.readValue(body, Content.Class); Sin embargo, esto falla. Jackson ignora las anotaciones y asigna todo a Pet en lugar de Dog :
Dog dog = (Dog) content.getPet(); // -> ClassCastExceptionComo solución alternativa, agregué anotaciones mixtas que no hacen nada más que las anotaciones originales. La única diferencia es que residen en una clase separada:
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true) @JsonSubTypes({ @Type(value = Cat.class, name = "Cat"), @Type(value = Dog.class, name = "Dog")}) public class PetAnnotations { }Ahora esto funciona:
// like above mapper.addMixInAnnotations(Pet.class, PetAnnotations.class); Content content = mapper.readValue(body, Content.Class); Dog dog = (Dog) content.getPet(); // -> works!¿Alguna idea de por qué Jackson ignora las anotaciones en clase pero respeta las anotaciones que entrego explícitamente como complementos?