I read a lot about this issue in stackoverflow, but any solution works for me. Can someone please tell me why it does not work, as I described all the children correctly, or maybe not?
This is my jackson addiction
<context:annotation-config/> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.10</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.3.2</version> </dependency>
The main class with my abstract object as a property (MLMObject)
public class MLMResponse { private int errorCode; private String errorMessage; private MLMObject object; public MLMResponse() { } public int getErrorCode() { return errorCode; } public void setErrorCode(int errorCode) { this.errorCode = errorCode; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } public MLMObject getObject() { return object; } public void setObject(MLMObject object) { this.object = object; } }
abstract class implementation
import com.fasterxml.jackson.annotation.*; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value=Person.class, name="person"), }) public abstract class MLMObject { public MLMObject() { super(); } }
Child class implementation
import com.fasterxml.jackson.annotation.JsonTypeName; @JsonTypeName("person") public class Person extends MLMObject{ private String name; private String secondName; public Person() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSecondName() { return secondName; } public void setSecondName(String secondName) { this.secondName = secondName; } }
and json text I will read - this is just a test for a real message.
String msg = "{\"errorCode\": 0,\"errorMessage\":\"\",\"object\":{\"type\":\"person\",\"name\":\"Jan\",\"secondName\":\"Jan\"}}";
I am trying to read it with the following code
ObjectMapper objectMapper = new ObjectMapper(); MLMResponse emp = objectMapper.readValue(msg, MLMResponse.class);
But when I run it, I get the following error.
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.pl.model.MLMObject, problem: abstract types can only be instantiated with additional type information at [Source: java.io.StringReader@a06816 ; line: 1, column: 34] (through reference chain: com.pl.model.MLMResponse["object"]) at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233) at org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:60) at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863) at com.pl.service.JacksonMappingService.mapLoginMessage(JacksonMappingService.java:22) at com.pl.controller.HelloWorldController.hello(HelloWorldController.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
Can someone help me with this?
Relations Yang