2016-06-15 2 views
0

Java:polymorphes désérialisation question Jackson

/** 
*/ 
@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", 
    } 
} 

Quand je suis en train de désérialiser réponse ci-dessus JSON java, jackson jette l'erreur ci-dessous. Quelqu'un peut-il m'aider s'il vous plaît à résoudre ce problème.

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) 

Répondre

0

Vous pouvez voir ce post, je pense que vous trouverez ce que vous voulez: Jackson JSON Polymorphism

PS: être carreful, vous parfois avoir "_type" et parfois "type".