2016-06-15 25 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」和某個「類型」。