java - example - Jackson: la propiedad @JsonTypeInfo se asigna como nula?
@jsontypeinfo example (2)
Finalmente, he encontrado la solución en la API Doc.
Nota sobre la visibilidad del identificador de tipo: de forma predeterminada, la deserialización (uso durante la lectura de JSON) del identificador de tipo es completamente manejada por Jackson, y no se pasa a los deserializadores. Sin embargo, si así se desea, es posible definir la propiedad visible = true, en cuyo caso la propiedad se pasará como está a los deserializadores (y se establecerá mediante el establecedor o campo) en la deserialización.
Así que la solución fue simplemente agregar el atributo '' visible '' de la siguiente manera
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "exercise_type",
visible = true)
@JsonSubTypes({
@Type(value = ExerciseChoiceResponseDTO.class, name = "CHOICE"),
@Type(value = ExerciseQuestionResponseDTO.class, name = "QUESTION")})
public abstract class ExerciseMixIn
{}
Espero que esto ayude a alguien más.
Estoy tratando con este problema. Digamos que tengo esta respuesta:
{
"id":"decaa828741611e58bcffeff819cdc9f",
"statement":"question statement",
"exercise_type":"QUESTION"
}
Luego, basado en el atributo exercise_type, quiero crear instancias de diferentes objetos (subclases de ExerciseResponseDTO
), por lo que creo esta mezcla en:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "exercise_type")
@JsonSubTypes({
@Type(value = ExerciseChoiceResponseDTO.class, name = "CHOICE"),
@Type(value = ExerciseQuestionResponseDTO.class, name = "QUESTION")})
public abstract class ExerciseMixIn
{}
public abstract class ExerciseResponseDTO {
private String id;
private String statement;
@JsonProperty(value = "exercise_type") private String exerciseType;
// Getters and setters
}
public class ExerciseQuestionResponseDTO
extends ExerciseResponseDTO {}
public class ExerciseChoiceResponseDTO
extends ExerciseResponseDTO {}
Así que creo mi ObjectMapper
siguiente manera
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(ExerciseResponseDTO.class, ExerciseMixIn.class);
Mi prueba:
ExerciseResponseDTO exercise = mapper.readValue(serviceResponse, ExerciseResponseDTO.class)
Assert.assertTrue(exercise.getClass() == ExerciseQuestionResponseDTO.class); // OK
Assert.assertEquals("decaa828741611e58bcffeff819cdc9f" exercise.getId()); // OK
Assert.assertEquals("question statement", exercise.getStatement()); // OK
Assert.assertEquals("QUESTION", exercise.getExerciseType()); // FAIL. Expected: "QUESTION", actual: null
El problema es que, por alguna razón, el atributo exercise_type que se usa como propiedad en @JsonTypeInfo
se asigna como nulo . ¿Alguna idea de cómo puedo resolver esto?
Según la respuesta de @jscherman configurando, ''visible'' verdadero en JsonTypeInfo ayudará a acceder a exercise_type como un campo.
Si usa la misma clase para serializar también, el JSON resultante tendrá el tipo de ejercicio apareciendo dos veces. Así que es mejor actualizar también incluir a JsonTypeInfo.As.EXISTING_PROPERTY
Y también vale la pena mirar todas las otras opciones para incluir.