2016-06-15 6 views
0

Java:Полиморфные десериализации Джексон вопрос

/** 
*/ 
@JsonTypeInfo(include=As.PROPERTY, property="_type", use=Id.NAME) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=Dog.class, name="dog"), 
    @JsonSubTypes.Type(value=Cat.class, name="cat"), 
    }) 
@ResourceName("animal"); 
public interface AnimalDto { 

    /** 
    * Stop gap property to deal with jackson not serializing type information 
    * when using {@link JsonTypeInfo} 
    * 
    * @return A string name of the type of Animal 
    */ 
    @JsonProperty("_type") 
} 



public abstract class WildAnimal implements AnimalDto { 
    private final String type; 
    @Override 
    public String getType(){ 
     return this.type; 
    } 
} 

@JsonTypeName("dog") 
public class Dog implements WildAnimal { 
} 

@JsonTypeName("cat") 
public class Cat implements WildAnimal { 
} 

JSON:

{ 
    "animal": { 
     "_type":"dog", 
     "id": "1", 
    } 
} 

Когда я пытаюсь десериализации выше ответ JSON в Java, джексон бросает ошибку ниже. Может кто-то, пожалуйста, помогите мне решить эту проблему.

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '_type' that is to contain type id (for class Animal) 
at [Source: [email protected]fe3f; line: 1, column: 111]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '_type' that is to contain type id (for class Animal) 
at [Source: [email protected]fe3f; line: 1, column: 111] 
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228) 
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220) 
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:795) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:779) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:559) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454) 

ответ

0

Вы можете увидеть это сообщение, я думаю, вы обнаружите, что вы хотите: Jackson JSON Polymorphism

PS: быть carreful, вы когда-нибудь есть «_Type» и когда-то «тип».

Смежные вопросы