2014-04-10 13 views
6

Tôi đã đọc rất nhiều về vấn đề này trên stackoverflow nhưng bất kỳ giải pháp làm việc cho tôi. Ai có thể vui lòng cho tôi biết tại sao nó không hoạt động vì tôi đã mô tả tất cả trẻ em phản đối đúng cách - hoặc có thể không?Json và lớp trừu tượng 'Không thể xây dựng thể hiện'

này là sự phụ thuộc của tôi cho jackson

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

lớp chính với đối tượng trừu tượng của tôi là tài sản (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; 
    } 



} 

lớp trừu tượng thực hiện

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


} 

lớp trẻ thực hiện

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




} 

và văn bản json tôi sẽ đọc - đây chỉ là bài kiểm tra cho thông điệp thực.

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

Tôi đang cố gắng để đọc nó với mã sau đây

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

Nhưng khi tôi chạy nó tôi nhận được lỗi sau.

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) 

thể ai vui lòng giúp tôi với điều đó?

Trân Jan

+0

bản sao có thể có của [vấn đề tuần tự hóa/deserialization Jersey: các loại trừu tượng chỉ có thể được khởi tạo với thông tin loại bổ sung] (http://stackoverflow.com/questions/9066288/jersey-serialization-deserialization-issue-abstract-types-can -only-be-instantia) –

+0

Bạn có thể vui lòng cung cấp đoạn mã mà bạn đang tạo đối tượng 'msg' không – tmarwen

Trả lời

7

Đồng bộ hóa các phiên bản Jackson của bạn. Jackson 1 tìm chú thích Jackson 1 và Jackson 2 tìm kiếm chú thích Jackson 2. Bạn đang cố gắng để có Jackson 1 tìm chú thích Jackson 2. Điều này chỉ đơn giản là sẽ không hoạt động.

Các vấn đề liên quan