Свойство Jackson - @JsonTypeInfo отображается как null?
Я имею дело с этой проблемой. Допустим, у меня есть такой ответ:
{
"id":"decaa828741611e58bcffeff819cdc9f",
"statement":"question statement",
"exercise_type":"QUESTION"
}
затем на основании exercise_type атрибут я хочу создать экземпляры различных объектов (подклассы ExerciseResponseDTO
), поэтому я создаю эту смесь в:
@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 {}
поэтому я создаю свой ObjectMapper
следующим образом
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(ExerciseResponseDTO.class, ExerciseMixIn.class);
мой тест:
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
проблема в том, что по какой-то причине exercise_type атрибут используется как свойство на @JsonTypeInfo
отображается как null.
Есть идеи, как я могу это решить?
2 ответов
наконец, я нашел решение в API Doc
примечание о видимости идентификатора типа: по умолчанию десериализация (использование при чтении JSON) идентификатора типа полностью обрабатывается Джексоном, и не передается дезертирам. Однако если да, то желательно, можно определить свойство visible = true, в котором собственность дело будет передано в десериализаторы (и установить через сеттер или поле) на десериализация.
таким образом, решение было просто добавлением'видимого следующим образом
@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
{}
надеюсь, это поможет кому-то еще.
по состоянию на @jscherman ответ установив,' visible ' true в JsonTypeInfo поможет получить доступ к exercise_type в качестве поля.
Если вы используете тот же класс для сериализации, то результирующий JSON будет иметь exercise_type дважды. Поэтому лучше также обновить include доJsonTypeInfo.Как.EXISTING_PROPERTY
и это также стоит посмотреть на все остальные варианты для включить.