2014-04-10 30 views
6

Stackoverflow'ta bu sorun hakkında çok şey okudum ancak herhangi bir çözüm benim için çalışıyor. Lütfen, lütfen tüm çocukların nesnelerini doğru olarak tarif ettiğimden beri neden çalışmadığını söyler misiniz?Json ve soyut sınıf 'Örnek oluşturulamıyor'

Bu

<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> 
mülkiyet (MLMObject) olarak benim soyut nesne ile

Ana sınıfı

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



} 

soyut sınıf uygulaması

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


} 

Çocuk sınıf uygulaması

jackson

benim bağımlılık vardır
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; 
    } 




} 

ve json metni Okuyacağım - bu sadece gerçek mesaj için testtir.

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

Ben kodu

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

aşağıdaki ile okumaya çalışıyorum Ama bunu çalıştırdığınızda aşağıdaki hatayı alıyorum.

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) 

Bu konuda bana yardımcı olabilecek herhangi biri olabilir mi?

Selamlar Oca

+0

[Jersey serileştirme/serileştirme sorununun olası kopyası: soyut türler yalnızca ek tür bilgileriyle örneklenebilir] (http://stackoverflow.com/questions/9066288/jersey-serialization-deserialization-issue-abstract-types-can -only-be-instantia) –

+0

'msg' nesnesini oluştururken kod parçasını verebilir misiniz? – tmarwen

cevap

7

sizin Jackson sürümlerini senkronize edin. Jackson 1 Jackson 1 ek açıklamaları ve Jackson 2 Jackson 2 ek açıklamaları için görünüyor. Jackson 2'nin Jackson 2 ek açıklamalarına bakmaya çalışıyorsunuz. Bu sadece işe yaramaz.

İlgili konular