2014-04-10 15 views
6

我已經閱讀了很多關於這個問題的stackoverflow,但任何解決方案適用於我。有沒有人可以告訴我爲什麼它不起作用,因爲我已經描述了所有兒童的對象 - 或者可能不是?Json和抽象類'不能構造實例'

這是我對傑克遜

<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> 

與我的抽象對象的屬性(MLMObject)主類

​​

抽象類實現

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();   
    } 


} 

子類實現

依賴
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; 
    } 




} 

和json text我要讀 - 這只是測試真正的消息。

String msg = "{\"errorCode\": 0,\"errorMessage\":\"\",\"object\":{\"type\":\"person\",\"name\":\"Jan\",\"secondName\":\"Jan\"}}"; 

我試着用下面的代碼

ObjectMapper objectMapper = new ObjectMapper(); 
MLMResponse emp = objectMapper.readValue(msg, MLMResponse.class); 

讀它但是當我運行它,我得到以下錯誤。

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: [email protected]; 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) 

請問有人能幫我嗎?

問候 月

+0

[Jersey序列化/反序列化問題:抽象類型只能使用附加類型信息實例化](http://stackoverflow.com/questions/9066288/jersey-serialization-deserialization-issue-abstract-types-can -only-be-instantia) –

+0

能否請你提供一段代碼,你正在創建'msg'對象 – tmarwen

回答

7

同步您的傑克遜版本。 Jackson 1尋找Jackson 1註釋,Jackson 2尋找Jackson 2註釋。你正在試圖讓Jackson 1尋找Jackson 2的註釋。這根本行不通。