2015-11-09 12 views
21

私はこの問題に取り組んでいます。のは、私はこのレスポンスを持っているとしましょう: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 {} 

01:

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

私のテストを次のように私は私のObjectMapperを作成します

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 

問題は、何らかの理由で、@JsonTypeInfoにプロパティとして使用されているexercise_type属性がヌルとしてマッピングされている、ということです。 どのように私はこれを解決することができますか?

答えて

40

最後に、私は、タイプ識別子の視認性にAPI Doc

注液を見つけた:デフォルトでは、タイプ識別子のデシリアライゼーション (JSONの読み出し中に使用)が完全にジャクソン に処理され、デシリアライザには渡されません。ただし、 が必要な場合は、 の大文字小文字のプロパティがデシリアライザにそのまま渡される(および のセッタまたはフィールドを介して設定される)プロパティをdeserializationに渡してプロパティ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 
{} 

希望、これは他の誰かを助けを次のように解決策は、単に「見える」属性を追加しました。

+0

良い知見。 :) – Rick

+0

[古代の知恵](https://xkcd.com/979/) –

関連する問題