2015-11-09 4 views
21

मैं इस समस्या से निपट रहा हूं। मान लीजिए कि मैं इस प्रतिक्रिया करते हैं: पर exercise_type विशेषता आधारित फिरजैक्सन - @JsonTypeInfo संपत्ति को शून्य के रूप में मैप किया जा रहा है?

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

, मैं विभिन्न वस्तुओं उदाहरणों (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 पर के रूप में अशक्त मैप किया जा रहा है इस्तेमाल किया जा रहा है। कोई विचार है कि मैं इसे कैसे हल कर सकता हूं?

उत्तर

40

अंत में, मैं प्रकार पहचानकर्ता की दृश्यता पर में API Doc

नोट समाधान मिल गया है: डिफ़ॉल्ट रूप से, अक्रमांकन प्रकार पहचानकर्ता के (JSON के पढ़ने के दौरान उपयोग) पूरी तरह से जैक्सन ने नियंत्रित किया जाता है, और deserializers को पारित नहीं किया गया है। हालांकि, यदि वांछित है, तो संपत्ति को दृश्यमान = सही परिभाषित करना संभव है जिसमें केस संपत्ति को deserializers (और सेटर या फ़ील्ड के माध्यम से सेट करें) deserialization पर पास किया जाएगा।

तो समाधान बस 'दिखाई' विशेषता के रूप में इस प्रकार है

@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/) –

संबंधित मुद्दे