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",
    }
}

When I am trying to deserialize above json response to java, jackson throws the below error. Can someone please help me resolve this issue.

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: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@4b10fe3f; 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: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@4b10fe3f; 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)
ttzn
  • 2,543
  • 22
  • 26
Suresh
  • 13
  • 6

1 Answers1

0

You can see this post I think you'll find what you want : Jackson JSON Polymorphism

PS : be carreful, you sometime have "_type" and sometime "type".

Community
  • 1
  • 1
zThulj
  • 149
  • 7