2015-11-09 5 views
21

Ich habe mit diesem Problem zu tun. Lassen Sie uns sagen, ich habe diese Antwort:Jackson - @JsonTypeInfo Eigenschaft wird als Null zugeordnet?

{ 
    "id":"decaa828741611e58bcffeff819cdc9f", 
    "statement":"question statement", 
    "exercise_type":"QUESTION" 
} 

Dann wird basierend auf exercise_type Attribut i verschiedene Objekte Instanzen (Subklassen von ExerciseResponseDTO) instanziiert wollen, so mache ich diese Mischung in:

@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 {} 

So ich eröffne mein ObjectMapper als

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixIn(ExerciseResponseDTO.class, ExerciseMixIn.class); 

Mein Test folgt:

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 

Das Problem ist, dass aus irgendeinem Grund, die exercise_type Attribut als Eigenschaft auf @JsonTypeInfo verwendet wird, als null abgebildet wird. Irgendeine Idee, wie ich das lösen kann? standardmäßig Deserialisierung (Verwendung beim Lesen von JSON) der Typkennung wird vollständig behandelt von Jackson,:

Antwort

40

Schließlich habe ich die Lösung in dem

Hinweis auf der Sichtbarkeit der Typkennung API Doc

gefunden und wird nicht an Deserializer übergeben. Wenn dies jedoch gewünscht wird, ist es möglich, die Eigenschaft visible = true zu definieren, in der die Falleigenschaft unverändert an Deserializer übergeben wird (und über Setter oder Feld festgelegt wird).

So wurde die Lösung einfach Hinzufügen der 'sichtbar' Attribut als

@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 
{} 

Hoffnung folgt dies jemand anderes hilft.

+0

Gute finden. :) – Rick

+0

[Weisheit der Alten] (https://xkcd.com/979/) –